diff --git a/MODULE.bazel b/MODULE.bazel index 31b9540..c9b4383 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -7,9 +7,9 @@ module( ) # Lower-bounds (minimum) versions for direct runtime dependencies -bazel_dep(name = "aspect_bazel_lib", version = "1.31.2") -bazel_dep(name = "aspect_rules_js", version = "1.31.0") # Note: only used for provider symbols, we don't spawn nodejs actions -bazel_dep(name = "bazel_skylib", version = "1.4.1") +bazel_dep(name = "aspect_bazel_lib", version = "2.7.1") +bazel_dep(name = "aspect_rules_js", version = "2.0.0-alpha.3") # Note: only used for provider symbols, we don't spawn nodejs actions +bazel_dep(name = "bazel_skylib", version = "1.5.0") bazel_dep(name = "platforms", version = "0.0.7") swc = use_extension("@aspect_rules_swc//swc:extensions.bzl", "swc") diff --git a/WORKSPACE b/WORKSPACE index 339303f..8fd5418 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -19,24 +19,11 @@ swc_register_toolchains( swc_version = LATEST_SWC_VERSION, ) -load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "register_jq_toolchains") +load("@aspect_rules_js//js:toolchains.bzl", "DEFAULT_NODE_VERSION", "rules_js_register_toolchains") -aspect_bazel_lib_dependencies(override_local_config_platform = True) +rules_js_register_toolchains(node_version = DEFAULT_NODE_VERSION) -register_jq_toolchains() - -load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") - -rules_js_dependencies() - -load("@rules_nodejs//nodejs:repositories.bzl", "DEFAULT_NODE_VERSION", "nodejs_register_toolchains") - -nodejs_register_toolchains( - name = "nodejs", - node_version = DEFAULT_NODE_VERSION, -) - -load("@aspect_rules_js//npm:npm_import.bzl", "npm_translate_lock") +load("@aspect_rules_js//npm:repositories.bzl", "npm_translate_lock") npm_translate_lock( name = "npm", diff --git a/docs/swc.md b/docs/swc.md index f3a090b..4fefde1 100644 --- a/docs/swc.md +++ b/docs/swc.md @@ -37,7 +37,7 @@ for example to set your own output labels for `js_outs`. | :------------- | :------------- | :------------- | :------------- | :------------- | | name | A unique name for this target. | Name | required | | | srcs | source files, typically .ts files in the source tree | List of labels | required | | -| data | Runtime dependencies to include in binaries/tests that depend on this target.

The transitive npm dependencies, transitive sources, default outputs and runfiles of targets in the `data` attribute are added to the runfiles of this target. They should appear in the '*.runfiles' area of any executable which has a runtime dependency on this target.

If this list contains linked npm packages, npm package store targets or other targets that provide `JsInfo`, `NpmPackageStoreInfo` providers are gathered from `JsInfo`. This is done directly from the `npm_package_store_deps` field of these. For linked npm package targets, the underlying `npm_package_store` target(s) that back the links is used. Gathered `NpmPackageStoreInfo` providers are propagated to the direct dependencies of downstream linked `npm_package` targets.

NB: Linked npm package targets that are "dev" dependencies do not forward their underlying `npm_package_store` target(s) through `npm_package_store_deps` and will therefore not be propagated to the direct dependencies of downstream linked `npm_package` targets. npm packages that come in from `npm_translate_lock` are considered "dev" dependencies if they are have `dev: true` set in the pnpm lock file. This should be all packages that are only listed as "devDependencies" in all `package.json` files within the pnpm workspace. This behavior is intentional to mimic how `devDependencies` work in published npm packages. | List of labels | optional | `[]` | +| data | Runtime dependencies to include in binaries/tests that depend on this target.

Follows the same semantics as `js_library` `data` attribute. See https://docs.aspect.build/rulesets/aspect_rules_js/docs/js_library#data for more info. | List of labels | optional | `[]` | | args | Additional arguments to pass to swcx cli (NOT swc!).

NB: this is not the same as the CLI arguments for @swc/cli npm package. For performance, rules_swc does not call a Node.js program wrapping the swc rust binding. Instead, we directly spawn the (somewhat experimental) native Rust binary shipped inside the @swc/core npm package, which the swc project calls "swcx" Tracking issue for feature parity: https://github.com/swc-project/swc/issues/4017 | List of strings | optional | `[]` | | js_outs | list of expected JavaScript output files.

There should be one for each entry in srcs. | List of labels | optional | `[]` | | map_outs | list of expected source map output files.

Can be empty, meaning no source maps should be produced. If non-empty, there should be one for each entry in srcs. | List of labels | optional | `[]` | @@ -83,7 +83,7 @@ Execute the SWC compiler ## swc_plugin
-swc_plugin(name, src, config, kwargs)
+swc_plugin(name, srcs, config, kwargs)
 
Configure an SWC plugin @@ -94,7 +94,7 @@ Configure an SWC plugin | Name | Description | Default Value | | :------------- | :------------- | :------------- | | name | A name for this target | none | -| src | Label for the plugin, either a directory containing a package.json pointing at a wasm file as the main entrypoint, or a wasm file. Usually a linked npm package target via rules_js. | `None` | +| srcs | Plugin files. Either a directory containing a package.json pointing at a wasm file as the main entrypoint, or a wasm file. Usually a linked npm package target via rules_js. | `[]` | | config | Optional configuration dict for the plugin. This is passed as a JSON object into the `jsc.experimental.plugins` entry for the plugin. | `{}` | | kwargs | additional keyword arguments passed through to underlying rule, eg. `visibility`, `tags` | none | diff --git a/e2e/smoke/MODULE.bazel b/e2e/smoke/MODULE.bazel index 11d04e8..4142958 100644 --- a/e2e/smoke/MODULE.bazel +++ b/e2e/smoke/MODULE.bazel @@ -4,7 +4,7 @@ local_path_override( path = "../..", ) -bazel_dep(name = "bazel_skylib", version = "1.4.1", dev_dependency = True) +bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) # Optional: specify a custom swc toolchain instead of the default swc = use_extension("@aspect_rules_swc//swc:extensions.bzl", "swc", dev_dependency = True) diff --git a/examples/plugins/BUILD.bazel b/examples/plugins/BUILD.bazel index cbc7539..08aa7f5 100644 --- a/examples/plugins/BUILD.bazel +++ b/examples/plugins/BUILD.bazel @@ -16,7 +16,11 @@ npm_link_all_packages(name = "node_modules") # This requires that the package.json includes a main entrypoint pointing at the plugin wasm file. swc_plugin( name = "npm_plugin", - src = ":node_modules/@swc/plugin-transform-imports", + srcs = [ + # reference the location where the "@swc/plugin-transform-imports" npm package was linked in our root Bazel package. + ":node_modules/@swc/plugin-transform-imports", + ":node_modules/@swc/plugin-transform-imports/dir", + ], # optional plugin config, the JSON object for the plugin passed into jsc.experimental.plugins # https://swc.rs/docs/configuration/compilation#jscexperimentalplugins config = { diff --git a/swc/defs.bzl b/swc/defs.bzl index 1e9f707..a15e7ad 100644 --- a/swc/defs.bzl +++ b/swc/defs.bzl @@ -128,13 +128,13 @@ _swc_plugin = rule( provides = _swc_plugin_lib.provides, ) -def swc_plugin(name, src = None, config = {}, **kwargs): +def swc_plugin(name, srcs = [], config = {}, **kwargs): """Configure an SWC plugin Args: name: A name for this target - src: Label for the plugin, either a directory containing a package.json pointing at a wasm file + srcs: Plugin files. Either a directory containing a package.json pointing at a wasm file as the main entrypoint, or a wasm file. Usually a linked npm package target via rules_js. config: Optional configuration dict for the plugin. This is passed as a JSON object into the @@ -146,9 +146,14 @@ def swc_plugin(name, src = None, config = {}, **kwargs): if not types.is_dict(config): fail("config must be a dict, not a " + type(config)) + # For backward compat + src = kwargs.pop("src", None) + if src: + srcs = srcs[:] + [src] + _swc_plugin( name = name, - src = src, + srcs = srcs, config = json.encode(config), **kwargs ) diff --git a/swc/dependencies.bzl b/swc/dependencies.bzl index 8ec684e..7eeee3d 100644 --- a/swc/dependencies.bzl +++ b/swc/dependencies.bzl @@ -15,20 +15,27 @@ def http_archive(**kwargs): def rules_swc_dependencies(): http_archive( name = "bazel_skylib", - sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", - urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz"], + sha256 = "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", + urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz"], ) http_archive( name = "aspect_bazel_lib", - sha256 = "0da75299c5a52737b2ac39458398b3f256e41a1a6748e5457ceb3a6225269485", - strip_prefix = "bazel-lib-1.31.2", - url = "https://github.com/aspect-build/bazel-lib/releases/download/v1.31.2/bazel-lib-v1.31.2.tar.gz", + sha256 = "b554eb7942a5ab44c90077df6a0c76fc67c5874c9446a007e9ba68be82bd4796", + strip_prefix = "bazel-lib-2.7.1", + url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.7.1/bazel-lib-v2.7.1.tar.gz", ) http_archive( name = "aspect_rules_js", - sha256 = "7b2a4d1d264e105eae49a27e2e78065b23e2e45724df2251eacdd317e95bfdfd", - strip_prefix = "rules_js-1.31.0", - url = "https://github.com/aspect-build/rules_js/releases/download/v1.31.0/rules_js-v1.31.0.tar.gz", + sha256 = "32546833201bec90457c20b979889cccd2049ec6766a57dc51d184e02cb88200", + strip_prefix = "rules_js-2.0.0-alpha.3", + url = "https://github.com/aspect-build/rules_js/releases/download/v2.0.0-alpha.3/rules_js-v2.0.0-alpha.3.tar.gz", + ) + + http_archive( + name = "rules_nodejs", + sha256 = "dddd60acc3f2f30359bef502c9d788f67e33814b0ddd99aa27c5a15eb7a41b8c", + strip_prefix = "rules_nodejs-6.1.0", + url = "https://github.com/bazelbuild/rules_nodejs/releases/download/v6.1.0/rules_nodejs-v6.1.0.tar.gz", ) diff --git a/swc/private/swc.bzl b/swc/private/swc.bzl index 0d20dd1..1093e5c 100644 --- a/swc/private/swc.bzl +++ b/swc/private/swc.bzl @@ -42,7 +42,14 @@ _attrs = { If out_dir is also specified, it is used as the name of the output directory. Otherwise, the directory is named the same as the target.""", ), - "data": js_lib_helpers.JS_LIBRARY_DATA_ATTR, + "data": attr.label_list( + doc = """Runtime dependencies to include in binaries/tests that depend on this target. + +Follows the same semantics as `js_library` `data` attribute. See +https://docs.aspect.build/rulesets/aspect_rules_js/docs/js_library#data for more info. +""", + allow_files = True, + ), "swcrc": attr.label( doc = "label of a configuration file for swc, see https://swc.rs/docs/configuration/swcrc", allow_single_file = True, @@ -326,18 +333,18 @@ def _swc_impl(ctx): targets = ctx.attr.srcs, ) - transitive_declarations = js_lib_helpers.gather_transitive_declarations( - declarations = [], + transitive_types = js_lib_helpers.gather_transitive_types( + types = [], targets = ctx.attr.srcs, ) - npm_linked_packages = js_lib_helpers.gather_npm_linked_packages( + npm_sources = js_lib_helpers.gather_npm_sources( srcs = ctx.attr.srcs, deps = [], ) - npm_package_store_deps = js_lib_helpers.gather_npm_package_store_deps( - targets = ctx.attr.data, + npm_package_store_infos = js_lib_helpers.gather_npm_package_store_infos( + targets = ctx.attr.srcs + ctx.attr.data, ) runfiles = js_lib_helpers.gather_runfiles( @@ -349,14 +356,13 @@ def _swc_impl(ctx): return [ js_info( - npm_linked_package_files = npm_linked_packages.direct_files, - npm_linked_packages = npm_linked_packages.direct, - npm_package_store_deps = npm_package_store_deps, + target = ctx.label, sources = output_sources_depset, - transitive_declarations = transitive_declarations, - transitive_npm_linked_package_files = npm_linked_packages.transitive_files, - transitive_npm_linked_packages = npm_linked_packages.transitive, + types = depset(), # swc does not emit types directly transitive_sources = transitive_sources, + transitive_types = transitive_types, + npm_sources = npm_sources, + npm_package_store_infos = npm_package_store_infos, ), DefaultInfo( files = output_sources_depset, diff --git a/swc/private/swc_plugin.bzl b/swc/private/swc_plugin.bzl index 6a190c8..dd075ca 100644 --- a/swc/private/swc_plugin.bzl +++ b/swc/private/swc_plugin.bzl @@ -3,7 +3,7 @@ load("//swc:providers.bzl", "SwcPluginConfigInfo") _attrs = { - "src": attr.label( + "srcs": attr.label_list( doc = "label for the plugin, either a directory containing a package.json pointing at a wasm file as the main entrypoint, or a wasm file", providers = [DefaultInfo], mandatory = True, @@ -18,7 +18,7 @@ _attrs = { def _swc_plugin_impl(ctx): return [ DefaultInfo( - files = ctx.attr.src[DefaultInfo].files, + files = depset(ctx.files.srcs), ), SwcPluginConfigInfo( label = ctx.label,