Skip to content

Commit

Permalink
Pass output and intput options to the renderStart hook
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Nov 10, 2019
1 parent 7bcac52 commit d11bae6
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 18 deletions.
3 changes: 1 addition & 2 deletions src/rollup/index.ts
Expand Up @@ -255,7 +255,7 @@ export default async function rollup(rawInputOptions: GenericConfigObject): Prom
let outputBundle;

try {
await outputPluginDriver.hookParallel('renderStart', []);
await outputPluginDriver.hookParallel('renderStart', [outputOptions, inputOptions]);
const addons = await createAddons(outputOptions, outputPluginDriver);
for (const chunk of chunks) {
if (!inputOptions.preserveModules) chunk.generateInternalExports(outputOptions);
Expand Down Expand Up @@ -476,7 +476,6 @@ function normalizeOutputOptions(
const mergedOutputOptions = mergedOptions.outputOptions[0];
const outputOptionsReducer = (outputOptions: OutputOptions, result: OutputOptions) =>
result || outputOptions;
// TODO Lukas add inputOptions to hook
const outputOptions = outputPluginDriver.hookReduceArg0Sync(
'outputOptions',
[mergedOutputOptions],
Expand Down
48 changes: 32 additions & 16 deletions src/rollup/types.d.ts
Expand Up @@ -332,17 +332,14 @@ interface OnWriteOptions extends OutputOptions {
bundle: RollupBuild;
}

export interface PluginHooks {
interface OutputPluginHooks {
augmentChunkHash: (this: PluginContext, chunk: PreRenderedChunk) => string | void;
buildEnd: (this: PluginContext, err?: Error) => Promise<void> | void;
buildStart: (this: PluginContext, options: InputOptions) => Promise<void> | void;
generateBundle: (
this: PluginContext,
options: OutputOptions,
bundle: OutputBundle,
isWrite: boolean
) => void | Promise<void>;
load: LoadHook;
/** @deprecated Use `generateBundle` instead */
ongenerate: (
this: PluginContext,
Expand All @@ -355,33 +352,50 @@ export interface PluginHooks {
options: OnWriteOptions,
chunk: OutputChunk
) => void | Promise<void>;
options: (this: MinimalPluginContext, options: InputOptions) => InputOptions | null | undefined;
outputOptions: (this: PluginContext, options: OutputOptions) => OutputOptions | null | undefined;
renderChunk: RenderChunkHook;
renderError: (this: PluginContext, err?: Error) => Promise<void> | void;
renderStart: (this: PluginContext) => Promise<void> | void;
renderStart: (
this: PluginContext,
outputOptions: OutputOptions,
inputOptions: InputOptions
) => Promise<void> | void;
/** @deprecated Use `resolveFileUrl` instead */
resolveAssetUrl: ResolveAssetUrlHook;
resolveDynamicImport: ResolveDynamicImportHook;
resolveFileUrl: ResolveFileUrlHook;
resolveId: ResolveIdHook;
resolveImportMeta: ResolveImportMetaHook;
transform: TransformHook;
/** @deprecated Use `renderChunk` instead */
transformBundle: TransformChunkHook;
/** @deprecated Use `renderChunk` instead */
transformChunk: TransformChunkHook;
watchChange: (id: string) => void;
writeBundle: (this: PluginContext, bundle: OutputBundle) => void | Promise<void>;
}

export interface Plugin extends Partial<PluginHooks> {
banner?: AddonHook;
cacheKey?: string;
footer?: AddonHook;
intro?: AddonHook;
export interface PluginHooks extends OutputPluginHooks {
buildEnd: (this: PluginContext, err?: Error) => Promise<void> | void;
buildStart: (this: PluginContext, options: InputOptions) => Promise<void> | void;
load: LoadHook;
options: (this: MinimalPluginContext, options: InputOptions) => InputOptions | null | undefined;
resolveId: ResolveIdHook;
resolveImportMeta: ResolveImportMetaHook;
transform: TransformHook;
watchChange: (id: string) => void;
}

interface OutputPluginValueHooks {
banner: AddonHook;
cacheKey: string;
footer: AddonHook;
intro: AddonHook;
outro: AddonHook;
}

export interface Plugin extends Partial<PluginHooks>, Partial<OutputPluginValueHooks> {
name: string;
}

export interface OutputPlugin extends Partial<OutputPluginHooks>, Partial<OutputPluginValueHooks> {
name: string;
outro?: AddonHook;
}

export interface TreeshakingOptions {
Expand Down Expand Up @@ -475,6 +489,7 @@ export interface OutputOptions {
noConflict?: boolean;
outro?: string | (() => string | Promise<string>);
paths?: OptionsPaths;
plugins?: OutputPlugin[];
preferConst?: boolean;
sourcemap?: boolean | 'inline' | 'hidden';
sourcemapExcludeSources?: boolean;
Expand Down Expand Up @@ -553,6 +568,7 @@ export interface RollupBuild {
}

export interface RollupOptions extends InputOptions {
// This is included for compatibility with config files but ignored by rollup.rollup
output?: OutputOptions | OutputOptions[];
}

Expand Down
33 changes: 33 additions & 0 deletions test/function/samples/options-in-renderstart/_config.js
@@ -0,0 +1,33 @@
const assert = require('assert');
const checkedOptions = [];

module.exports = {
description: 'makes input and output options available in renderStart',
options: {
context: 'global',
plugins: {
name: 'input-plugin',
renderStart(outputOptions, inputOptions) {
checkedOptions.push('input-plugin', outputOptions.format, inputOptions.context);
}
},
output: {
plugins: {
name: 'output-plugin',
renderStart(outputOptions, inputOptions) {
checkedOptions.push('output-plugin', outputOptions.format, inputOptions.context);
}
}
}
},
exports: () => {
assert.deepStrictEqual(checkedOptions, [
'output-plugin',
'cjs',
'global',
'input-plugin',
'cjs',
'global'
]);
}
};
1 change: 1 addition & 0 deletions test/function/samples/options-in-renderstart/main.js
@@ -0,0 +1 @@
assert.ok(this);

0 comments on commit d11bae6

Please sign in to comment.