wesl-plugin
Version:
[](https://www.npmjs.com/package/wesl-plugin) [](https://wesl-lang.dev/)
136 lines (97 loc) • 3.37 kB
Markdown
# WESL Plugin
[](https://www.npmjs.com/package/wesl-plugin)
[](https://wesl-lang.dev/)
Bundler plugin for importing `.wesl` and `.wgsl` shader files in JavaScript/TypeScript.
## Install
```
npm install wesl wesl-plugin
```
## Quick Start
### Build-time linking (?static)
Link shaders at build time for the smallest application bundle size.
```ts
// vite.config.ts
import { staticBuildExtension } from "wesl-plugin";
import viteWesl from "wesl-plugin/vite";
export default {
plugins: [viteWesl({ extensions: [staticBuildExtension] })]
};
```
```ts
// app.ts
import wgsl from "./shaders/main.wesl?static";
const module = device.createShaderModule({ code: wgsl });
```
### Runtime linking (?link)
Link shaders at runtime when you need dynamic conditions or constants:
```ts
// vite.config.ts
import { linkBuildExtension } from "wesl-plugin";
import viteWesl from "wesl-plugin/vite";
export default {
plugins: [viteWesl({ extensions: [linkBuildExtension] })]
};
```
```ts
// app.ts
import { link } from "wesl";
import shaderConfig from "./shaders/main.wesl?link";
const linked = await link({
...shaderConfig,
conditions: { MOBILE: isMobileGPU },
constants: { num_lights: 4 }
});
const module = linked.createShaderModule(device, {});
```
## Other Bundlers
```ts
import viteWesl from "wesl-plugin/vite";
import esbuildWesl from "wesl-plugin/esbuild";
import rollupWesl from "wesl-plugin/rollup";
import webpackWesl from "wesl-plugin/webpack";
// Also: nuxt, farm, rspack, astro
```
## Extensions
Extensions enable different import suffixes:
| Extension | Suffix | Output | Use Case |
|-----------|--------|--------|----------|
| `staticBuildExtension` | `?static` | WGSL string | Build-time linking, simplest |
| `linkBuildExtension` | `?link` | LinkParams object | Runtime conditions/constants |
### Combining Extensions
```ts
import { staticBuildExtension, linkBuildExtension } from "wesl-plugin";
import viteWesl from "wesl-plugin/vite";
export default {
plugins: [viteWesl({
extensions: [staticBuildExtension, linkBuildExtension]
})]
};
```
### Conditions in Import Path
For `?static`, you can specify conditions directly in the import:
```ts
import wgsl from "./app.wesl MOBILE=true DEBUG=false ?static";
```
## Configuration (wesl.toml)
The plugin reads `wesl.toml` to find shader files and dependencies:
```toml
weslFiles = ["shaders/**/*.wesl"]
weslRoot = "shaders"
dependencies = ["auto"] # Auto-detect from package.json
```
## Prototype Extensions
- **SimpleReflectExtension** - Demo for extension authors showing how to generate JS/TS from shader structs
- **BindingLayoutExtension** - Prototype for generating `BindGroupLayout` objects from shaders
## Writing Custom Extensions
```ts
import type { PluginExtension } from "wesl-plugin";
const myExtension: PluginExtension = {
extensionName: "myfeature", // enables ?myfeature imports
emitFn: async (shaderPath, api, conditions) => {
const sources = await api.weslSrc();
// Return JavaScript code as a string
return `export default ${JSON.stringify(sources)};`;
}
};
```
See [PluginExtension.ts](https://github.com/wgsl-tooling-wg/wesl-js/blob/main/tools/packages/wesl-plugin/src/PluginExtension.ts) for the full API.