You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
8.3 KiB

# Neutrino API
8 years ago
When using Neutrino via the [CLI](/cli/README.md), it creates an instance of the Neutrino API which picks up
8 years ago
any presets and arguments passed on the command line or located in package.json. If you desire, you can also create your
own instance of the Neutrino API and interact with it programmatically.
8 years ago
## Instantiation
In order to access the Neutrino API, you must require or import it and instantiate it, passing in any
8 years ago
options:
8 years ago
Using `require`:
```js
const Neutrino = require('neutrino');
8 years ago
const api = new Neutrino(options);
8 years ago
```
Using ES imports:
```js
import Neutrino from 'neutrino';
8 years ago
const api = new Neutrino(options);
```
## Loading middleware
Using the Neutrino API you can load [middleware](/middleware/README.md) and presets (which are also just middleware)
using the `use` method. The `use` method takes in a middleware function, and optionally any options that should be
passed to the middleware function.
```js
api.use(middleware, middlewareOptions)
```
Typically presets do not require any additional options, and middleware may, but check with your particular package
for specifics. As an example, if you wanted to require the list of presets and Neutrino options from a package.json:
```js
const Neutrino = require('neutrino');
const pkg = require('./package.json');
const api = new Neutrino(pkg.neutrino.options);
api.use(require(pkg.neutrino.presets[0]));
```
You can call `.use` iteratively for multiple presets:
```js
pkg.neutrino.presets
.forEach(preset => neutrino.use(require(preset)));
8 years ago
```
## Environment
When using the CLI, environment variables are automatically set based on the command you are using.
When using the API this is not the case, and you **must** set it prior to calling any build commands or
8 years ago
loading any presets if you expect them to build correctly based on their target.
8 years ago
```js
process.env.NODE_ENV = 'production';
const api = new Neutrino();
8 years ago
// load presets...
8 years ago
api.build();
```
## API
### Constructor
8 years ago
When creating a Neutrino instance, you have the option of providing an object which can be passed as options to
middleware as `neutrino.options`.
8 years ago
8 years ago
```js
const Neutrino = require('neutrnino');
const api = new Neutrino();
// or with optional options
const api = new Neutrino({ jest: { bail: true } });
```
8 years ago
### `.config`
When constructing a Neutrino instance, a property of `.config` is set to be a new instance of
8 years ago
[webpack-chain](https://github.com/mozilla-neutrino/webpack-chain). This property is then available to all presets
which subsequently augment it with their specific configuration. All middleware and presets added use this single
`.config` to store their data, meaning that middleware load order has an effect on which config values take precedence.
Middleware loaded first will have any configuration overridden by later middleware with matching properties.
### `.use(middleware, middlewareOptions)`
Invoke a Neutrino middleware function, optionally providing options which will be passed to the middleware function.
Middleware will be invoked with two arguments:
1. The Neutrino instance
2. The optional `middlewareOptions`
For example, given the following middleware function:
```js
function middleware(neutrino, options) {
neutrino.config
.entry('index')
.prepend(options.entryPoint);
}
// Passing this middleware function to Neutrino, along with some options:
neutrino.use(middleware, { entryPoint: 'babel-polyfill' });
```
8 years ago
### `start(args)`
The `start()` method is responsible for creating a development bundle, and when possible, starting a development
server or source watcher. Prior to starting this process, Neutrino will trigger and wait for `prestart` events to
finish. After it is complete, Neutrino will trigger and wait for `start` events to finish.
8 years ago
If the Neutrino config contains options for `devServer`, then a webpack-dev-server will be started, otherwise a Webpack
source watcher will be started.
8 years ago
Currently any `args` passed to `start()` have no effect and will be passed through to any event handlers.
The `start` method will return a Promise which resolves after the build is done or development watcher has stopped,
and all `start` events have finished.
```js
api
.start()
.then(() => console.log('Exiting!'));
```
### `build(args)`
The `build()` method is responsible for creating a bundle typically used for production. Prior to starting this process,
Neutrino will trigger and wait for `prebuild` events to finish. After it is complete, Neutrino will trigger and wait for
`build` events to finish.
Currently any `args` passed to `build()` have no effect and will be passed through to any event handlers.
The `build` method will return a Promise which resolves after the build is done and all `build` events have finished, or
will reject if there was a failure during building.
```js
api
.build()
.then(() => console.log('Saved to build/'))
.catch(err => console.error(err));
```
### `test(args)`
The `test()` method is responsible for gathering args needed for testing and triggering relevant events as a signal to
8 years ago
test presets that they may run. Using the `test` method does nothing other than triggering these events; without
middleware listening for these events, nothing will happen. Prior to starting this process, Neutrino will trigger and
wait for `pretest` events to finish. After it is complete, Neutrino will trigger and wait for
8 years ago
`test` events to finish, in which test runners will do their work.
Any `args` passed to `test()` are passed on to the event handles and typically have properties for an array of
`files` to test, as well as a property for `watch`ing and rerunning tests.
The `test` method will return a Promise which resolves after all `test` events have finished, or
will reject if there was a failure during testing.
```js
api
.test()
.then(() => console.log('all passed'))
.catch(err => console.error(err));
api
.test({
files: [/* ... */],
watch: true
})
.then(() => console.log('all passed'));
```
### `getWebpackOptions()`
While tools like webpack-chain provide a convenient API for creating Webpack configurations, this is not a format that
is understandable by Webpack. With `getWebpackOptions()`, the webpack-chain instance at `.config` will be converted to
8 years ago
an configuration object readable directly by Webpack.
8 years ago
```js
api.getWebpackOptions(); // -> { ... }
```
### `emitForAll(eventName, payload)`
Trigger a Promise-dependent event. For example, calling `emitForAll('build')` will trigger an event named build, and
each event handler can return a Promise denoting when it is finished. When all events have finished, this call will
resolve.
This method returns a Promise which resolves when all event handlers have also resolved.
```js
api
.emitForAll('custom-event')
.then(() => console.log('All custom-events have resolved!'));
```
By passing an additional argument for `payload`, you can pass custom data to all the event handlers
```js
api.emitForAll('custom-event', { custom: 'payload' });
// ...
neutrino.on('custom-event', (args, payload) => {
console.log(payload.custom); // "payload"
});
```
8 years ago
### `handleErrors(err, stats)`
This method is used internally to create a consistent console output when errors occur in the build. It will
8 years ago
log the `err` property and any errors from `stats` if applicable, and return `true` or `false` depending on if there
_were_ errors.
This method returns a Boolean.
```js
const failed = api.handleErrors(err, stats);
if (failed) {
console.log('The build failed!');
}
```
8 years ago
### `devServer()`
8 years ago
8 years ago
This method is used internally to generate an instance of webpack-dev-server when using `start()`. It returns a promise
that resolves when the process receives a `SIGINT` event to stop.
8 years ago
```js
api
._devServer()
.then(() => console.log('Exiting process...'));
```
8 years ago
### `builder()`
This method is used internally to generate an instance of a Webpack compiler when using `build()`. It returns a promise
that resolves when the Webpack build has completed, or rejects if the build fails.
```js
api
.builder()
.then(() => console.log('Exiting process...'))
.catch(() => console.error('Build failed!'));
```
### `watcher()`
This method is used internally to generate an instance of a Webpack source watcher when using `start()`. It returns a promise
that resolves when the process receives a `SIGINT` event to stop and the watcher has closed.
```js
api
.watcher()
.then(() => console.log('Exiting process, done watching...'));
```