https://github.com/codex-/rollup-plugin-conditional-exec
Execute a given command after a bundle has been written, with optional conditions
https://github.com/codex-/rollup-plugin-conditional-exec
plugin rollup shell typescript
Last synced: 12 months ago
JSON representation
Execute a given command after a bundle has been written, with optional conditions
- Host: GitHub
- URL: https://github.com/codex-/rollup-plugin-conditional-exec
- Owner: Codex-
- License: mit
- Created: 2022-02-23T23:24:08.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-03-20T02:24:16.000Z (12 months ago)
- Last Synced: 2025-03-20T03:31:39.688Z (12 months ago)
- Topics: plugin, rollup, shell, typescript
- Language: TypeScript
- Homepage:
- Size: 1.41 MB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# rollup-plugin-conditional-exec
> ⚙️🚀 Execute commands after writing a bundle with optionally provided conditions
[](https://github.com/Codex-/rollup-plugin-conditional-exec/actions/workflows/build.yml)
[](https://codecov.io/gh/Codex-/rollup-plugin-conditional-exec)
[](https://www.npmjs.com/package/rollup-plugin-conditional-exec)
This package facilitates executing a given command after a bundle has been written by Rollup. The timing of the execution of the given command can be leveraged by providing a condition to satisfy before performing the command.
For example, if you are a Vite user and you generate bundled code for `es` & `umd`, you can write a condition function in your `vite.config.ts` that will only return true once both values have been observed, as Vite will run rollup twice to generate both of these.
I built this primarily so that after each successful bundle had been generated, `yalc push` would be called.
## Usage
Create a `rollup.config.js` configuration file and import this plugin:
```ts
import conditionalExec from "rollup-plugin-conditional-exec";
export default {
input: "src/index.js",
output: {
file: "dist/index.js",
format: "cjs",
},
plugins: [
conditionalExec({
command: "yalc push",
}),
],
};
```
## Options
Typings for the options are available by importing `RollupConditionalExecOptions`.
### `command`
Type: `string`
Required: `true`
This is the command you want to be executed after a bundle has been written.
### `options`
Type: `object`
Default: `{ stdio: "inherit" }`
See [`CommonExecOptions`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback) for available options.
If an options object is provided, it will override the default.
### `condition`
Type: `() => Promise | boolean` | `(outputOpts: OutputOptions) => Promise | boolean`
Default: `() => true`
Provide an optional condition to satisfy before a given command is executed. The condition command is passed in the `OutputOptions` that are give to `writeBundle` to allow you to leverage build time specific options. i.e. which bundle you are currently generating in a series of bundling operations.
### `afterExec`
Type: `() => Promise | void`
Default: `() => undefined`
Provide an optional function to be executed after the command has been executed successfully. This can allow you to tidy up state, where you need to reset a state between bundles when running in a build watch mode or similar.
### `onError`
Type: `(error: Error) => Promise | void`
Default:
```ts
(error: Error) => {
console.error(`Exec has failed: ${error.message}`);
console.debug(error.stack);
throw error;
};
```
Provide an optional function to be executed should your provided command fail to execute successfully. By default, this will log your error and then rethrow the error to prevent a silent failure.
## How it works
### This plugin leverages the following hooks provided by Rollup
- Build Hooks
- [`buildStart`](https://rollupjs.org/guide/en/#buildstart)
- An assertion is completed here to validate that the command itself is both provided and not an empty string.
- Output Generation Hooks
- [`writeBundle`](https://rollupjs.org/guide/en/#writebundle)
- It is at this stage that commands are executed via Nodes `exec` function.
### Simplified Flow of used hooks
```ascii
┌──────────────── Rollup ────────────────┐
│ │
│ │
│ ┌──────────────┐ │
│ │ buildStart │ │
│ └───────┬──────┘ │
│ │ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Assert cmd │ │
│ │ ├─── false ──┐ │
│ │ is defined │ │ │
│ └───────┬──────┘ │ │
│ │ │ │
│ │ │ │
│ true │ │
│ │ ▼ │
│ ▼ ┌─────────┐ │
│ ┌───────────────┐ │ Fail │ │
│ │ writeBundle │ │ │ │
│ └───────┬───────┘ │ Build │ │
│ │ └─────────┘ │
│ │ ▲ │
│ ▼ │ │
│ ┌───────────┐ │ │
│ │ execute │ │ │
│ │ ├──── error ──┘ │
│ │ command │ │
│ └─────┬─────┘ │
│ │ │
│ │ │
│ success │
│ │ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Completed │ │
│ └─────────────┘ │
│ │
│ │
└────────────────────────────────────────┘
```