rspack_binding_builder_macros 0.6.3

Rspack binding builder macros
# rspack_binding_builder_macros

Exports a few macros to help you create a custom plugin register with Rspack.

## Important

This crate is used for creating a custom binding. It is not intended to be used directly by non-custom binding users.

## Guide

[Rspack Custom binding](https://rspack-contrib.github.io/rspack-rust-book/custom-binding/getting-started/index.html)

## Usage

### register_plugin

Create a custom plugin register with Rspack.

The created plugin register will be exposed to the final N-API binding.

The plugin needs to be wrapped with `require('@rspack/core').experiments.createNativePlugin`
to be used in the host.

#### Parameters

`register_plugin` macro accepts two arguments:

- The name of the plugin
- A resolver function that returns a `rspack_core::BoxPlugin`

The resolver function accepts two arguments:

- `env`: The environment of the plugin, it is the same as `napi::bindgen_prelude::Env`
- `options`: The options of the plugin, it is the same as `napi::bindgen_prelude::Unknown<'_>`

The resolver function should return a `rspack_core::BoxPlugin`

#### Example

This example will expose `registerMyBannerPlugin` in the final N-API binding:

> **Note:** The following example requires the `napi_derive`, `rspack_binding_builder_macros`, `rspack_core`, and `rspack_error` crates, and is for illustration only. It may not compile without additional setup.

```rust,ignore
use napi_derive::napi;
use rspack_binding_builder_macros::register_plugin;

register_plugin!(
  "MyBannerPlugin",
  |env: napi::bindgen_prelude::Env, options: napi::bindgen_prelude::Unknown<'_>| {
    Ok(Box::new(MyBannerPlugin) as rspack_core::BoxPlugin)
  }
);

#[derive(Debug)]
struct MyBannerPlugin;

impl rspack_core::Plugin for MyBannerPlugin {
  fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> rspack_error::Result<()> {
    Ok(())
  }
}
```

The `registerMyBannerPlugin` function will be exposed to the final N-API binding.

```js
const { registerMyBannerPlugin } = require("your-custom-binding");

const plugin = registerMyBannerPlugin();
```

To actually use the plugin, you need to wrap it with `require('@rspack/core').experiments.createNativePlugin`:

```js
require("@rspack/core").experiments.createNativePlugin(
	"MyBannerPlugin",
	options => options
);
```