xref: /aosp_15_r20/external/bazelbuild-rules_rust/wasm_bindgen/rules_nodejs/defs.bzl (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1"""Rust WASM-bindgen rules for interfacing with bazelbuild/rules_nodejs"""
2
3load("@rules_nodejs//nodejs:providers.bzl", "DeclarationInfo", "JSModuleInfo")
4load("//wasm_bindgen/private:wasm_bindgen.bzl", "WASM_BINDGEN_ATTR", "rust_wasm_bindgen_action")
5
6def _nodejs_rust_wasm_bindgen_impl(ctx):
7    toolchain = ctx.toolchains[Label("//wasm_bindgen:toolchain_type")]
8
9    info = rust_wasm_bindgen_action(
10        ctx = ctx,
11        toolchain = toolchain,
12        wasm_file = ctx.attr.wasm_file,
13        target_output = ctx.attr.target,
14        bindgen_flags = ctx.attr.bindgen_flags,
15    )
16
17    # Return a structure that is compatible with the deps[] of a ts_library.
18    declarations = info.ts
19    es5_sources = info.js
20
21    return [
22        DefaultInfo(
23            files = depset([info.wasm], transitive = [info.js, info.ts]),
24        ),
25        DeclarationInfo(
26            declarations = declarations,
27            transitive_declarations = declarations,
28            type_blocklisted_declarations = depset([]),
29        ),
30        JSModuleInfo(
31            direct_sources = es5_sources,
32            sources = es5_sources,
33        ),
34        info,
35    ]
36
37nodejs_rust_wasm_bindgen = rule(
38    doc = """\
39Generates javascript and typescript bindings for a webassembly module using [wasm-bindgen][ws] that interface with [bazelbuild/rules_nodejs][bbnjs].
40
41[ws]: https://rustwasm.github.io/docs/wasm-bindgen/
42[bbnjs]: https://github.com/bazelbuild/rules_nodejs
43
44An example of this rule in use can be seen at [@rules_rust//examples/wasm_bindgen/rules_js](../examples/wasm_bindgen/rules_js)
45""",
46    implementation = _nodejs_rust_wasm_bindgen_impl,
47    attrs = WASM_BINDGEN_ATTR,
48    toolchains = [
49        str(Label("//wasm_bindgen:toolchain_type")),
50    ],
51)
52