Skip to content

Commit

Permalink
Make sure this.addWatchFile also declares transform dependencies,
Browse files Browse the repository at this point in the history
fix some error messages and inconsistencies in the changelog and+
document this.addWatchFile
  • Loading branch information
lukastaegert committed Jan 4, 2019
1 parent fbb5f9e commit 542f0a4
Show file tree
Hide file tree
Showing 9 changed files with 811 additions and 566 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Expand Up @@ -57,8 +57,8 @@
- transformChunk
- ongenerate
- onwrite
* Plugin transform dependencies are deprecated in favour of the `watchChange` plugin hook (#2409)
* Accessing `this.watcher` in plugin hooks is deprecated in favour of the `watchChange` plugin hook (#2409)
* Plugin transform dependencies are deprecated in favour of using the `this.addWatchFile` plugin context function (#2409)
* Accessing `this.watcher` in plugin hooks is deprecated in favour of the `watchChange` plugin hook and the `this.addWatchFile` plugin context function (#2409)
* Using dynamic import statements will by default create a new chunk unless `inlineDynamicImports` is used (#2293)
* Rollup now uses acorn@6 which means that acorn plugins must be compatible with this version; acorn is now external for non-browser builds to make plugins work (#2293)

Expand Down
8 changes: 8 additions & 0 deletions docs/05-plugins.md
Expand Up @@ -199,6 +199,14 @@ More properties may be supported in future, as and when they prove necessary.

A number of utility functions and informational bits can be accessed from within all [hooks](guide/en#hooks) via `this`:

#### `this.addWatchFile(id: string) => void`

Adds additional files to be monitored in watch mode so that changes to these files will trigger rebuilds. `id` can be an absolute path to a file or directory or a path relative to the current working directory. This context function can only be used in hooks during the build phase, i.e. in `buildStart`, `load`, `resolveId`, and `transform`.

**Note:** Usually in watch mode to improve rebuild speed, the `transform` hook will only be triggered for a given module if its contents actually changed. Using `this.addWatchFile` from within the `transform` hook will make sure the `transform` hook is also reevaluated if the watched file changes.

In general, it is recommended to use `this.addWatchfile` from within the hook that depends on the watched file.

#### `this.emitAsset(assetName: string, source: string) => void`

Emits a custom file to include in the build output, returning its `assetId`. You can defer setting the source if you provide it later via `this.setAssetSource(assetId)`. A string or Buffer source must be set for each asset through either method or an error will be thrown on generate completion.
Expand Down
15 changes: 8 additions & 7 deletions src/utils/pluginDriver.ts
Expand Up @@ -57,18 +57,17 @@ export function createPluginDriver(
): PluginDriver {
const plugins = [...(options.plugins || []), getRollupDefaultPlugin(options)];
const { emitAsset, getAssetFileName, setAssetSource } = createAssetPluginHooks(graph.assetsById);
const existingPluginKeys: string[] = [];
const existingPluginKeys: { [key: string]: true } = {};

let hasLoadersOrTransforms = false;

const pluginContexts: PluginContext[] = plugins.map((plugin, pidx) => {
let cacheable = true;
if (typeof plugin.cacheKey !== 'string') {
if (typeof plugin.name !== 'string') {
if (typeof plugin.name !== 'string' || existingPluginKeys[plugin.name]) {
cacheable = false;
} else {
if (existingPluginKeys.indexOf(plugin.name) !== -1) cacheable = false;
existingPluginKeys.push(plugin.name);
existingPluginKeys[plugin.name] = true;
}
}

Expand All @@ -90,14 +89,16 @@ export function createPluginDriver(
cacheInstance = uncacheablePlugin(plugin.name);
}

const firstWatchHandler = true;
let watcherDeprecationWarningShown = false;

function deprecatedWatchListener(event: string, handler: () => void): EventEmitter {
if (firstWatchHandler)
if (!watcherDeprecationWarningShown) {
context.warn({
code: 'PLUGIN_WATCHER_DEPRECATED',
message: `this.watcher usage is deprecated in plugins. Use the watchChange plugin hook instead.`
message: `this.watcher usage is deprecated in plugins. Use the watchChange plugin hook and this.addWatchFile() instead.`
});
watcherDeprecationWarningShown = true;
}
return watcher.on(event, handler);
}

Expand Down
5 changes: 5 additions & 0 deletions src/utils/transform.ts
Expand Up @@ -130,6 +130,11 @@ export default function transform(
pluginContext.error(err);
},
emitAsset,
addWatchFile(id: string) {
if (!transformDependencies) transformDependencies = [];
transformDependencies.push(id);
pluginContext.addWatchFile(id);
},
setAssetSource(assetId, source) {
pluginContext.setAssetSource(assetId, source);
if (!customTransformCache && !setAssetSourceErr) {
Expand Down
2 changes: 1 addition & 1 deletion test/hooks/index.js
Expand Up @@ -1139,7 +1139,7 @@ module.exports = input;
assert.equal(warning.pluginCode, 'PLUGIN_WATCHER_DEPRECATED');
assert.equal(
warning.message,
'this.watcher usage is deprecated in plugins. Use the watchChange plugin hook instead.'
'this.watcher usage is deprecated in plugins. Use the watchChange plugin hook and this.addWatchFile() instead.'
);
},
plugins: [
Expand Down

0 comments on commit 542f0a4

Please sign in to comment.