From 738d6caa3f561c3eb45e09197f12c51c02555385 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 23 Apr 2019 07:42:38 +0200 Subject: [PATCH] Do not require `input` to be set if a dynamic entry is emitted --- src/Graph.ts | 7 +++---- src/finalisers/amd.ts | 2 +- src/rollup/index.ts | 2 +- src/rollup/types.d.ts | 3 +-- src/utils/mergeOptions.ts | 4 ++-- src/watch/index.ts | 14 ++++++++------ .../chunk-filename-not-available/_config.js | 0 .../chunk-filename-not-available/chunk.js | 0 .../chunk-filename-not-available/main.js | 0 .../chunk-not-found/_config.js | 0 .../chunk-not-found/main.js | 0 .../invalid-chunk-id/_config.js | 0 .../invalid-chunk-id/main.js | 0 .../modules-loaded/_config.js | 0 .../modules-loaded/chunk.js | 0 .../modules-loaded/main.js | 0 .../samples/emit-chunk/no-input/_config.js | 12 ++++++++++++ test/function/samples/emit-chunk/no-input/chunk.js | 1 + 18 files changed, 29 insertions(+), 16 deletions(-) rename test/function/samples/{emit-entry-chunk => emit-chunk}/chunk-filename-not-available/_config.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/chunk-filename-not-available/chunk.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/chunk-filename-not-available/main.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/chunk-not-found/_config.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/chunk-not-found/main.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/invalid-chunk-id/_config.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/invalid-chunk-id/main.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/modules-loaded/_config.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/modules-loaded/chunk.js (100%) rename test/function/samples/{emit-entry-chunk => emit-chunk}/modules-loaded/main.js (100%) create mode 100644 test/function/samples/emit-chunk/no-input/_config.js create mode 100644 test/function/samples/emit-chunk/no-input/chunk.js diff --git a/src/Graph.ts b/src/Graph.ts index 415eee6ee19..714cb49241c 100644 --- a/src/Graph.ts +++ b/src/Graph.ts @@ -108,10 +108,6 @@ export default class Graph { this.cacheExpiry = options.experimentalCacheExpiry; - if (!options.input) { - throw new Error('You must supply options.input to rollup'); - } - this.treeshake = options.treeshake !== false; if (this.treeshake) { this.treeshakingOptions = options.treeshake @@ -214,6 +210,9 @@ export default class Graph { this.moduleLoader.addEntryModules(normalizeEntryModules(entryModules), true), manualChunks && this.moduleLoader.addManualChunks(manualChunks) ]).then(([{ entryModules, manualChunkModulesByAlias }]) => { + if (entryModules.length === 0) { + throw new Error('You must supply options.input to rollup'); + } for (const entryModule of entryModules) { if (entryModule.chunkAlias === null) { entryModule.chunkAlias = getAliasName(entryModule.id); diff --git a/src/finalisers/amd.ts b/src/finalisers/amd.ts index fb51b193ec9..534c41fb778 100644 --- a/src/finalisers/amd.ts +++ b/src/finalisers/amd.ts @@ -6,7 +6,7 @@ import getExportBlock from './shared/getExportBlock'; import getInteropBlock from './shared/getInteropBlock'; import warnOnBuiltins from './shared/warnOnBuiltins'; -// TODO Lukas consider improved AMD relative imports: +// TODO consider using improved AMD relative imports: // https://requirejs.org/docs/api.html#modulenotes-urls // AMD resolution will only respect the AMD baseUrl if the .js extension is omitted. diff --git a/src/rollup/index.ts b/src/rollup/index.ts index a98543e6a05..f35cf6aca88 100644 --- a/src/rollup/index.ts +++ b/src/rollup/index.ts @@ -67,7 +67,7 @@ function applyOptionHook(inputOptions: InputOptions, plugin: Plugin) { return inputOptions; } -function getInputOptions(rawInputOptions: GenericConfigObject): any { +function getInputOptions(rawInputOptions: GenericConfigObject): InputOptions { if (!rawInputOptions) { throw new Error('You must supply an options object to rollup'); } diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index e9f7f70f7d6..19f07e2fe99 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -214,7 +214,6 @@ export type ResolveAssetUrlHook = ( } ) => string | void; -// TODO Lukas do not require an input to be present if entries are created dynamically export type ResolveFileUrlHook = ( this: PluginContext, options: { @@ -326,7 +325,7 @@ export interface InputOptions { experimentalTopLevelAwait?: boolean; external?: ExternalOption; inlineDynamicImports?: boolean; - input: InputOption; + input?: InputOption; manualChunks?: { [chunkAlias: string]: string[] }; moduleContext?: ((id: string) => string) | { [id: string]: string }; onwarn?: WarningHandler; diff --git a/src/utils/mergeOptions.ts b/src/utils/mergeOptions.ts index a91739eb166..37016d94b5f 100644 --- a/src/utils/mergeOptions.ts +++ b/src/utils/mergeOptions.ts @@ -88,7 +88,7 @@ export default function mergeOptions({ config: GenericConfigObject; defaultOnWarnHandler?: WarningHandler; }): { - inputOptions: any; + inputOptions: InputOptions; optionError: string | null; outputOptions: any; } { @@ -204,7 +204,7 @@ function getInputOptions( experimentalTopLevelAwait: getOption('experimentalTopLevelAwait'), external: getExternal(config, command), inlineDynamicImports: getOption('inlineDynamicImports', false), - input: getOption('input'), + input: getOption('input', []), manualChunks: getOption('manualChunks'), moduleContext: config.moduleContext, onwarn: getOnWarn(config, command, defaultOnWarnHandler), diff --git a/src/watch/index.ts b/src/watch/index.ts index efae4a7053e..519ad166a2e 100644 --- a/src/watch/index.ts +++ b/src/watch/index.ts @@ -9,7 +9,8 @@ import { RollupBuild, RollupCache, RollupWatcher, - RollupWatchOptions + RollupWatchOptions, + WatcherOptions } from '../rollup/types'; import mergeOptions from '../utils/mergeOptions'; import chokidar from './chokidar'; @@ -28,7 +29,7 @@ export class Watcher { private tasks: Task[]; constructor(configs: RollupWatchOptions[]) { - this.emitter = new class extends EventEmitter implements RollupWatcher { + this.emitter = new (class extends EventEmitter implements RollupWatcher { close: () => void; constructor(close: () => void) { super(); @@ -37,7 +38,7 @@ export class Watcher { // showing the `MaxListenersExceededWarning` to the user. this.setMaxListeners(Infinity); } - }(this.close.bind(this)); + })(this.close.bind(this)); this.tasks = (Array.isArray(configs) ? configs : configs ? [configs] : []).map( config => new Task(this, config) ); @@ -144,8 +145,9 @@ export class Task { if (output.file || output.dir) return path.resolve(output.file || output.dir); }); - const watchOptions = inputOptions.watch || {}; - if ('useChokidar' in watchOptions) watchOptions.chokidar = watchOptions.useChokidar; + const watchOptions: WatcherOptions = inputOptions.watch || {}; + if ('useChokidar' in watchOptions) + (watchOptions as any).chokidar = (watchOptions as any).useChokidar; let chokidarOptions = 'chokidar' in watchOptions ? watchOptions.chokidar : !!chokidar; if (chokidarOptions) { chokidarOptions = { @@ -161,7 +163,7 @@ export class Task { ); } - this.chokidarOptions = chokidarOptions; + this.chokidarOptions = chokidarOptions as WatchOptions; this.chokidarOptionsHash = JSON.stringify(chokidarOptions); this.filter = createFilter(watchOptions.include, watchOptions.exclude); diff --git a/test/function/samples/emit-entry-chunk/chunk-filename-not-available/_config.js b/test/function/samples/emit-chunk/chunk-filename-not-available/_config.js similarity index 100% rename from test/function/samples/emit-entry-chunk/chunk-filename-not-available/_config.js rename to test/function/samples/emit-chunk/chunk-filename-not-available/_config.js diff --git a/test/function/samples/emit-entry-chunk/chunk-filename-not-available/chunk.js b/test/function/samples/emit-chunk/chunk-filename-not-available/chunk.js similarity index 100% rename from test/function/samples/emit-entry-chunk/chunk-filename-not-available/chunk.js rename to test/function/samples/emit-chunk/chunk-filename-not-available/chunk.js diff --git a/test/function/samples/emit-entry-chunk/chunk-filename-not-available/main.js b/test/function/samples/emit-chunk/chunk-filename-not-available/main.js similarity index 100% rename from test/function/samples/emit-entry-chunk/chunk-filename-not-available/main.js rename to test/function/samples/emit-chunk/chunk-filename-not-available/main.js diff --git a/test/function/samples/emit-entry-chunk/chunk-not-found/_config.js b/test/function/samples/emit-chunk/chunk-not-found/_config.js similarity index 100% rename from test/function/samples/emit-entry-chunk/chunk-not-found/_config.js rename to test/function/samples/emit-chunk/chunk-not-found/_config.js diff --git a/test/function/samples/emit-entry-chunk/chunk-not-found/main.js b/test/function/samples/emit-chunk/chunk-not-found/main.js similarity index 100% rename from test/function/samples/emit-entry-chunk/chunk-not-found/main.js rename to test/function/samples/emit-chunk/chunk-not-found/main.js diff --git a/test/function/samples/emit-entry-chunk/invalid-chunk-id/_config.js b/test/function/samples/emit-chunk/invalid-chunk-id/_config.js similarity index 100% rename from test/function/samples/emit-entry-chunk/invalid-chunk-id/_config.js rename to test/function/samples/emit-chunk/invalid-chunk-id/_config.js diff --git a/test/function/samples/emit-entry-chunk/invalid-chunk-id/main.js b/test/function/samples/emit-chunk/invalid-chunk-id/main.js similarity index 100% rename from test/function/samples/emit-entry-chunk/invalid-chunk-id/main.js rename to test/function/samples/emit-chunk/invalid-chunk-id/main.js diff --git a/test/function/samples/emit-entry-chunk/modules-loaded/_config.js b/test/function/samples/emit-chunk/modules-loaded/_config.js similarity index 100% rename from test/function/samples/emit-entry-chunk/modules-loaded/_config.js rename to test/function/samples/emit-chunk/modules-loaded/_config.js diff --git a/test/function/samples/emit-entry-chunk/modules-loaded/chunk.js b/test/function/samples/emit-chunk/modules-loaded/chunk.js similarity index 100% rename from test/function/samples/emit-entry-chunk/modules-loaded/chunk.js rename to test/function/samples/emit-chunk/modules-loaded/chunk.js diff --git a/test/function/samples/emit-entry-chunk/modules-loaded/main.js b/test/function/samples/emit-chunk/modules-loaded/main.js similarity index 100% rename from test/function/samples/emit-entry-chunk/modules-loaded/main.js rename to test/function/samples/emit-chunk/modules-loaded/main.js diff --git a/test/function/samples/emit-chunk/no-input/_config.js b/test/function/samples/emit-chunk/no-input/_config.js new file mode 100644 index 00000000000..ec7d2de6ece --- /dev/null +++ b/test/function/samples/emit-chunk/no-input/_config.js @@ -0,0 +1,12 @@ +module.exports = { + description: 'It is not necessary to provide an input if a dynamic entry is emitted', + options: { + input: undefined, + plugins: { + name: 'test-plugin', + buildStart() { + this.emitChunk('chunk.js'); + } + } + } +}; diff --git a/test/function/samples/emit-chunk/no-input/chunk.js b/test/function/samples/emit-chunk/no-input/chunk.js new file mode 100644 index 00000000000..c40c320ba58 --- /dev/null +++ b/test/function/samples/emit-chunk/no-input/chunk.js @@ -0,0 +1 @@ +assert.equal(42, 42);