From 22164ac5e6cd91ab2c169bcec52ef5e527190e7d Mon Sep 17 00:00:00 2001 From: Marco Schumacher Date: Tue, 6 Jul 2021 23:44:14 +0200 Subject: [PATCH 1/6] Added maxParallelFileReads. --- src/ModuleLoader.ts | 7 +++- src/rollup/types.d.ts | 2 ++ src/utils/options/mergeOptions.ts | 1 + src/utils/options/normalizeInputOptions.ts | 15 ++++++++ src/utils/queue.ts | 36 +++++++++++++++++++ test/function/samples/options-hook/_config.js | 1 + test/misc/optionList.js | 4 +-- 7 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/utils/queue.ts diff --git a/src/ModuleLoader.ts b/src/ModuleLoader.ts index 8dd6c8675a4..55a9285c0e8 100644 --- a/src/ModuleLoader.ts +++ b/src/ModuleLoader.ts @@ -30,6 +30,7 @@ import { } from './utils/error'; import { readFile } from './utils/fs'; import { isAbsolute, isRelative, resolve } from './utils/path'; +import { Queue } from './utils/queue'; import relativeId from './utils/relativeId'; import { resolveId } from './utils/resolveId'; import { timeEnd, timeStart } from './utils/timers'; @@ -53,6 +54,7 @@ export class ModuleLoader { private readonly indexedEntryModules: { index: number; module: Module }[] = []; private latestLoadModulesPromise: Promise = Promise.resolve(); private nextEntryModuleIndex = 0; + private readQueue = new Queue(); constructor( private readonly graph: Graph, @@ -63,6 +65,7 @@ export class ModuleLoader { this.hasModuleSideEffects = options.treeshake ? options.treeshake.moduleSideEffects : () => true; + this.readQueue.maxParallel = options.maxParallelFileReads; } async addAdditionalModules(unresolvedModules: string[]): Promise { @@ -217,7 +220,9 @@ export class ModuleLoader { timeStart('load modules', 3); let source: string | SourceDescription; try { - source = (await this.pluginDriver.hookFirst('load', [id])) ?? (await readFile(id)); + source = + (await this.pluginDriver.hookFirst('load', [id])) ?? + (await this.readQueue.run(() => readFile(id))); } catch (err) { timeEnd('load modules', 3); let msg = `Could not load ${id}`; diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 0bcf91597ae..107d9c75e7a 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -537,6 +537,7 @@ export interface InputOptions { makeAbsoluteExternalsRelative?: boolean | 'ifRelativeSource'; /** @deprecated Use the "manualChunks" output option instead. */ manualChunks?: ManualChunksOption; + maxParallelFileReads?: number; moduleContext?: ((id: string) => string | null | undefined) | { [id: string]: string }; onwarn?: WarningHandlerWithDefault; perf?: boolean; @@ -564,6 +565,7 @@ export interface NormalizedInputOptions { makeAbsoluteExternalsRelative: boolean | 'ifRelativeSource'; /** @deprecated Use the "manualChunks" output option instead. */ manualChunks: ManualChunksOption | undefined; + maxParallelFileReads: number; moduleContext: (id: string) => string; onwarn: WarningHandler; perf: boolean; diff --git a/src/utils/options/mergeOptions.ts b/src/utils/options/mergeOptions.ts index d3b908f0d61..0c1a84c12bc 100644 --- a/src/utils/options/mergeOptions.ts +++ b/src/utils/options/mergeOptions.ts @@ -120,6 +120,7 @@ function mergeInputOptions( input: getOption('input') || [], makeAbsoluteExternalsRelative: getOption('makeAbsoluteExternalsRelative'), manualChunks: getOption('manualChunks'), + maxParallelFileReads: getOption('maxParallelFileReads'), moduleContext: getOption('moduleContext'), onwarn: getOnWarn(config, defaultOnWarnHandler), perf: getOption('perf'), diff --git a/src/utils/options/normalizeInputOptions.ts b/src/utils/options/normalizeInputOptions.ts index a1aa3ff9e64..8b153b3fca0 100644 --- a/src/utils/options/normalizeInputOptions.ts +++ b/src/utils/options/normalizeInputOptions.ts @@ -50,6 +50,7 @@ export function normalizeInputOptions(config: InputOptions): { input: getInput(config), makeAbsoluteExternalsRelative: config.makeAbsoluteExternalsRelative ?? true, manualChunks: getManualChunks(config, onwarn, strictDeprecations), + maxParallelFileReads: getMaxParallelFileReads(config), moduleContext: getModuleContext(config, context), onwarn, perf: config.perf || false, @@ -175,6 +176,20 @@ const getManualChunks = ( return configManualChunks; }; +const getMaxParallelFileReads = ( + config: InputOptions +): NormalizedInputOptions['maxParallelFileReads'] => { + const maxParallelFileReads = config.maxParallelFileReads as unknown; + if (typeof maxParallelFileReads === 'number') { + if (maxParallelFileReads <= 0) return Infinity; + return maxParallelFileReads; + } + if (typeof maxParallelFileReads === 'string' && maxParallelFileReads.match(/^inf(inity)?$/i)) { + return Infinity; + } + return 20; +}; + const getModuleContext = ( config: InputOptions, context: string diff --git a/src/utils/queue.ts b/src/utils/queue.ts new file mode 100644 index 00000000000..8be2d4826d8 --- /dev/null +++ b/src/utils/queue.ts @@ -0,0 +1,36 @@ +export class Queue { + private queue = new Array<{ + reject: (reason?: any) => void; + resolve: (value: any) => void; + task: () => any; + }>(); + private workerCount = 0; + + constructor(public maxParallel = 1) {} + + run(task: () => T | Promise): Promise { + return new Promise((resolve, reject) => { + this.queue.push({ reject, resolve, task }); + this.work(); + }); + } + + private async work() { + if (this.workerCount >= this.maxParallel) return; + this.workerCount++; + + let entry; + while ((entry = this.queue.shift())) { + const { reject, resolve, task } = entry; + + try { + const result = await task(); + resolve(result); + } catch (err) { + reject(err); + } + } + + this.workerCount--; + } +} diff --git a/test/function/samples/options-hook/_config.js b/test/function/samples/options-hook/_config.js index 5fe694bb41b..84e642d66e1 100644 --- a/test/function/samples/options-hook/_config.js +++ b/test/function/samples/options-hook/_config.js @@ -20,6 +20,7 @@ module.exports = { experimentalCacheExpiry: 10, input: ['used'], makeAbsoluteExternalsRelative: true, + maxParallelFileReads: 20, perf: false, plugins: [ { diff --git a/test/misc/optionList.js b/test/misc/optionList.js index 4f1ef129f06..2b97b8da454 100644 --- a/test/misc/optionList.js +++ b/test/misc/optionList.js @@ -1,6 +1,6 @@ exports.input = - 'acorn, acornInjectPlugins, cache, context, experimentalCacheExpiry, external, inlineDynamicImports, input, makeAbsoluteExternalsRelative, manualChunks, moduleContext, onwarn, perf, plugins, preserveEntrySignatures, preserveModules, preserveSymlinks, shimMissingExports, strictDeprecations, treeshake, watch'; + 'acorn, acornInjectPlugins, cache, context, experimentalCacheExpiry, external, inlineDynamicImports, input, makeAbsoluteExternalsRelative, manualChunks, maxParallelFileReads, moduleContext, onwarn, perf, plugins, preserveEntrySignatures, preserveModules, preserveSymlinks, shimMissingExports, strictDeprecations, treeshake, watch'; exports.flags = - 'acorn, acornInjectPlugins, amd, assetFileNames, banner, c, cache, chunkFileNames, compact, config, configPlugin, context, d, dir, dynamicImportFunction, e, entryFileNames, environment, esModule, experimentalCacheExpiry, exports, extend, external, externalLiveBindings, f, failAfterWarnings, file, footer, format, freeze, g, globals, h, hoistTransitiveImports, i, indent, inlineDynamicImports, input, interop, intro, m, makeAbsoluteExternalsRelative, manualChunks, minifyInternalExports, moduleContext, n, name, namespaceToStringTag, noConflict, o, onwarn, outro, p, paths, perf, plugin, plugins, preferConst, preserveEntrySignatures, preserveModules, preserveModulesRoot, preserveSymlinks, sanitizeFileName, shimMissingExports, silent, sourcemap, sourcemapExcludeSources, sourcemapFile, stdin, strict, strictDeprecations, systemNullSetters, treeshake, v, validate, w, waitForBundleInput, watch'; + 'acorn, acornInjectPlugins, amd, assetFileNames, banner, c, cache, chunkFileNames, compact, config, configPlugin, context, d, dir, dynamicImportFunction, e, entryFileNames, environment, esModule, experimentalCacheExpiry, exports, extend, external, externalLiveBindings, f, failAfterWarnings, file, footer, format, freeze, g, globals, h, hoistTransitiveImports, i, indent, inlineDynamicImports, input, interop, intro, m, makeAbsoluteExternalsRelative, manualChunks, maxParallelFileReads, minifyInternalExports, moduleContext, n, name, namespaceToStringTag, noConflict, o, onwarn, outro, p, paths, perf, plugin, plugins, preferConst, preserveEntrySignatures, preserveModules, preserveModulesRoot, preserveSymlinks, sanitizeFileName, shimMissingExports, silent, sourcemap, sourcemapExcludeSources, sourcemapFile, stdin, strict, strictDeprecations, systemNullSetters, treeshake, v, validate, w, waitForBundleInput, watch'; exports.output = 'amd, assetFileNames, banner, chunkFileNames, compact, dir, dynamicImportFunction, entryFileNames, esModule, exports, extend, externalLiveBindings, file, footer, format, freeze, globals, hoistTransitiveImports, indent, inlineDynamicImports, interop, intro, manualChunks, minifyInternalExports, name, namespaceToStringTag, noConflict, outro, paths, plugins, preferConst, preserveModules, preserveModulesRoot, sanitizeFileName, sourcemap, sourcemapExcludeSources, sourcemapFile, sourcemapPathTransform, strict, systemNullSetters, validate'; From 7f502fca187f5e9b43757cd0ed610673cb4ab32d Mon Sep 17 00:00:00 2001 From: Marco Schumacher Date: Wed, 7 Jul 2021 10:11:35 +0200 Subject: [PATCH 2/6] Added some test for maxParallelFileReads setting. --- src/Graph.ts | 2 ++ src/ModuleLoader.ts | 9 ++++++++- src/rollup/rollup.ts | 1 + src/rollup/types.d.ts | 1 + .../max-parallel-file-reads-unlimited-zero/1.js | 1 + .../max-parallel-file-reads-unlimited-zero/2.js | 1 + .../max-parallel-file-reads-unlimited-zero/3.js | 1 + .../max-parallel-file-reads-unlimited-zero/4.js | 1 + .../max-parallel-file-reads-unlimited-zero/5.js | 1 + .../_config.js | 16 ++++++++++++++++ .../main.js | 5 +++++ .../max-parallel-file-reads-unlimited/1.js | 1 + .../max-parallel-file-reads-unlimited/2.js | 1 + .../max-parallel-file-reads-unlimited/3.js | 1 + .../max-parallel-file-reads-unlimited/4.js | 1 + .../max-parallel-file-reads-unlimited/5.js | 1 + .../max-parallel-file-reads-unlimited/_config.js | 16 ++++++++++++++++ .../max-parallel-file-reads-unlimited/main.js | 5 +++++ .../samples/max-parallel-file-reads/1.js | 1 + .../samples/max-parallel-file-reads/2.js | 1 + .../samples/max-parallel-file-reads/3.js | 1 + .../samples/max-parallel-file-reads/4.js | 1 + .../samples/max-parallel-file-reads/5.js | 1 + .../samples/max-parallel-file-reads/_config.js | 16 ++++++++++++++++ .../samples/max-parallel-file-reads/main.js | 5 +++++ 25 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/1.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/2.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/3.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/4.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/5.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/main.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/1.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/2.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/3.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/4.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/5.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/_config.js create mode 100644 test/function/samples/max-parallel-file-reads-unlimited/main.js create mode 100644 test/function/samples/max-parallel-file-reads/1.js create mode 100644 test/function/samples/max-parallel-file-reads/2.js create mode 100644 test/function/samples/max-parallel-file-reads/3.js create mode 100644 test/function/samples/max-parallel-file-reads/4.js create mode 100644 test/function/samples/max-parallel-file-reads/5.js create mode 100644 test/function/samples/max-parallel-file-reads/_config.js create mode 100644 test/function/samples/max-parallel-file-reads/main.js diff --git a/src/Graph.ts b/src/Graph.ts index a1643bb42e3..8ff5cc9254f 100644 --- a/src/Graph.ts +++ b/src/Graph.ts @@ -51,6 +51,8 @@ export default class Graph { moduleLoader: ModuleLoader; modulesById = new Map(); needsTreeshakingPass = false; + parallelFileReads = 0; + parallelFileReadsMax = 0; phase: BuildPhase = BuildPhase.LOAD_AND_PARSE; pluginDriver: PluginDriver; scope: GlobalScope; diff --git a/src/ModuleLoader.ts b/src/ModuleLoader.ts index 55a9285c0e8..0625d18276a 100644 --- a/src/ModuleLoader.ts +++ b/src/ModuleLoader.ts @@ -222,7 +222,14 @@ export class ModuleLoader { try { source = (await this.pluginDriver.hookFirst('load', [id])) ?? - (await this.readQueue.run(() => readFile(id))); + (await this.readQueue.run(async () => { + this.graph.parallelFileReads++; + this.graph.parallelFileReadsMax = Math.max( + this.graph.parallelFileReadsMax, + this.graph.parallelFileReads + ); + return readFile(id).finally(() => this.graph.parallelFileReads--); + })); } catch (err) { timeEnd('load modules', 3); let msg = `Could not load ${id}`; diff --git a/src/rollup/rollup.ts b/src/rollup/rollup.ts index fd8241fb852..dd6a091c3f5 100644 --- a/src/rollup/rollup.ts +++ b/src/rollup/rollup.ts @@ -86,6 +86,7 @@ export async function rollupInternal( graph ); }, + maxParallelFileReads: graph.parallelFileReadsMax, watchFiles: Object.keys(graph.watchFiles), async write(rawOutputOptions: OutputOptions) { if (result.closed) return error(errAlreadyClosed()); diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 107d9c75e7a..70f988f6e8e 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -791,6 +791,7 @@ export interface RollupBuild { closed: boolean; generate: (outputOptions: OutputOptions) => Promise; getTimings?: () => SerializedTimings; + maxParallelFileReads: number; watchFiles: string[]; write: (options: OutputOptions) => Promise; } diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/1.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/1.js new file mode 100644 index 00000000000..877dd1fbb70 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/1.js @@ -0,0 +1 @@ +export const x1 = 1; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/2.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/2.js new file mode 100644 index 00000000000..c269ae0d246 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/2.js @@ -0,0 +1 @@ +export const x2 = 2; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/3.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/3.js new file mode 100644 index 00000000000..1c323539956 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/3.js @@ -0,0 +1 @@ +export const x3 = 3; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/4.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/4.js new file mode 100644 index 00000000000..1b01b419ace --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/4.js @@ -0,0 +1 @@ +export const x4 = 4; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/5.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/5.js new file mode 100644 index 00000000000..734bf3f6f04 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/5.js @@ -0,0 +1 @@ +export const x5 = 5; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js new file mode 100644 index 00000000000..ba073bba181 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js @@ -0,0 +1,16 @@ +const assert = require('assert'); + +module.exports = { + description: 'limit parallel file reads', + options: { + maxParallelFileReads: 0 + }, + bundle(bundle) { + const maxParallelFileReads = bundle.maxParallelFileReads; + assert.strictEqual( + maxParallelFileReads, + 5, + 'Wrong number of parallel file reads: ' + maxParallelFileReads + ); + } +}; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/main.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/main.js new file mode 100644 index 00000000000..5f0a705e464 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited-zero/main.js @@ -0,0 +1,5 @@ +export * from './1'; +export * from './2'; +export * from './3'; +export * from './4'; +export * from './5'; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/1.js b/test/function/samples/max-parallel-file-reads-unlimited/1.js new file mode 100644 index 00000000000..877dd1fbb70 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/1.js @@ -0,0 +1 @@ +export const x1 = 1; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/2.js b/test/function/samples/max-parallel-file-reads-unlimited/2.js new file mode 100644 index 00000000000..c269ae0d246 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/2.js @@ -0,0 +1 @@ +export const x2 = 2; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/3.js b/test/function/samples/max-parallel-file-reads-unlimited/3.js new file mode 100644 index 00000000000..1c323539956 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/3.js @@ -0,0 +1 @@ +export const x3 = 3; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/4.js b/test/function/samples/max-parallel-file-reads-unlimited/4.js new file mode 100644 index 00000000000..1b01b419ace --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/4.js @@ -0,0 +1 @@ +export const x4 = 4; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/5.js b/test/function/samples/max-parallel-file-reads-unlimited/5.js new file mode 100644 index 00000000000..734bf3f6f04 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/5.js @@ -0,0 +1 @@ +export const x5 = 5; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/_config.js b/test/function/samples/max-parallel-file-reads-unlimited/_config.js new file mode 100644 index 00000000000..68e01596fc8 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/_config.js @@ -0,0 +1,16 @@ +const assert = require('assert'); + +module.exports = { + description: 'limit parallel file reads', + options: { + maxParallelFileReads: 'inf' + }, + bundle(bundle) { + const maxParallelFileReads = bundle.maxParallelFileReads; + assert.strictEqual( + maxParallelFileReads, + 5, + 'Wrong number of parallel file reads: ' + maxParallelFileReads + ); + } +}; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/main.js b/test/function/samples/max-parallel-file-reads-unlimited/main.js new file mode 100644 index 00000000000..5f0a705e464 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-unlimited/main.js @@ -0,0 +1,5 @@ +export * from './1'; +export * from './2'; +export * from './3'; +export * from './4'; +export * from './5'; diff --git a/test/function/samples/max-parallel-file-reads/1.js b/test/function/samples/max-parallel-file-reads/1.js new file mode 100644 index 00000000000..877dd1fbb70 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/1.js @@ -0,0 +1 @@ +export const x1 = 1; diff --git a/test/function/samples/max-parallel-file-reads/2.js b/test/function/samples/max-parallel-file-reads/2.js new file mode 100644 index 00000000000..c269ae0d246 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/2.js @@ -0,0 +1 @@ +export const x2 = 2; diff --git a/test/function/samples/max-parallel-file-reads/3.js b/test/function/samples/max-parallel-file-reads/3.js new file mode 100644 index 00000000000..1c323539956 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/3.js @@ -0,0 +1 @@ +export const x3 = 3; diff --git a/test/function/samples/max-parallel-file-reads/4.js b/test/function/samples/max-parallel-file-reads/4.js new file mode 100644 index 00000000000..1b01b419ace --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/4.js @@ -0,0 +1 @@ +export const x4 = 4; diff --git a/test/function/samples/max-parallel-file-reads/5.js b/test/function/samples/max-parallel-file-reads/5.js new file mode 100644 index 00000000000..734bf3f6f04 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/5.js @@ -0,0 +1 @@ +export const x5 = 5; diff --git a/test/function/samples/max-parallel-file-reads/_config.js b/test/function/samples/max-parallel-file-reads/_config.js new file mode 100644 index 00000000000..6a1edc71d0c --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/_config.js @@ -0,0 +1,16 @@ +const assert = require('assert'); + +module.exports = { + description: 'unlimited parallel file reads', + options: { + maxParallelFileReads: 3 + }, + bundle(bundle) { + const maxParallelFileReads = bundle.maxParallelFileReads; + assert.strictEqual( + maxParallelFileReads, + 3, + 'Wrong number of parallel file reads: ' + maxParallelFileReads + ); + } +}; diff --git a/test/function/samples/max-parallel-file-reads/main.js b/test/function/samples/max-parallel-file-reads/main.js new file mode 100644 index 00000000000..5f0a705e464 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads/main.js @@ -0,0 +1,5 @@ +export * from './1'; +export * from './2'; +export * from './3'; +export * from './4'; +export * from './5'; From 6e63ba6b54f83445390cbc1a6ecffa49f56e5c10 Mon Sep 17 00:00:00 2001 From: Marco Schumacher Date: Wed, 7 Jul 2021 13:08:28 +0200 Subject: [PATCH 3/6] Added tests for queue. --- package-lock.json | 494 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + test/misc/index.js | 1 + test/misc/queue.js | 33 +++ 4 files changed, 529 insertions(+) create mode 100644 test/misc/queue.js diff --git a/package-lock.json b/package-lock.json index ceff9b941f5..c66ea25d4fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1057,6 +1057,12 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -1135,6 +1141,12 @@ } } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1830,6 +1842,17 @@ "strip-final-newline": "^2.0.0" } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1877,6 +1900,15 @@ "reusify": "^1.0.4" } }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2267,6 +2299,15 @@ "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -2317,6 +2358,78 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -3461,6 +3574,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "nanoid": { "version": "3.1.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", @@ -3473,6 +3592,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -3796,6 +3921,12 @@ "word-wrap": "^1.2.3" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4223,6 +4354,328 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rewire": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-5.0.0.tgz", + "integrity": "sha512-1zfitNyp9RH5UDyGGLe9/1N0bMlPQ0WrX0Tmg11kMHBpqwPJI4gfPpP7YngFyLbFmhXh19SToAG0sKKEFcOIJA==", + "dev": true, + "requires": { + "eslint": "^6.8.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4323,6 +4776,12 @@ } } }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4355,6 +4814,12 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sander": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/sander/-/sander-0.6.0.tgz", @@ -4802,6 +5267,15 @@ "integrity": "sha512-2cp/YLRm7ly33CzvySyXqo/QEOu4KMn6fCof0gpqosWY3PEJUJJhXP/Cb2wXFUuCzWWJYEmPvdHNzjLlfXC49A==", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -5113,6 +5587,26 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", diff --git a/package.json b/package.json index 22b30a8fa05..5ca8eddb04b 100644 --- a/package.json +++ b/package.json @@ -103,6 +103,7 @@ "pretty-ms": "^7.0.1", "require-relative": "^0.8.7", "requirejs": "^2.3.6", + "rewire": "^5.0.0", "rollup": "^2.52.0", "rollup-plugin-license": "^2.5.0", "rollup-plugin-string": "^3.0.0", diff --git a/test/misc/index.js b/test/misc/index.js index 1cdb683e1e2..86eeefee0bf 100644 --- a/test/misc/index.js +++ b/test/misc/index.js @@ -4,5 +4,6 @@ require('./deprecations'); require('./iife'); require('./in-memory-sourcemaps'); require('./misc'); +require('./queue'); require('./sanity-checks'); require('./umd'); diff --git a/test/misc/queue.js b/test/misc/queue.js new file mode 100644 index 00000000000..cee6d3dca8b --- /dev/null +++ b/test/misc/queue.js @@ -0,0 +1,33 @@ +const assert = require('assert'); +const rewire = require('rewire'); +const { assertIncludes, loader } = require('../utils.js'); +const rollup = rewire('../../dist/shared/rollup'); + +const Queue = rollup.__get__('Queue'); + +describe('queue', () => { + it('max parallel execution', async () => { + let concurrency = 0, + maxConcurrency = 0; + const q = new Queue(5); + const promises = Array(10) + .fill(0) + .map(() => + q.run(async () => { + concurrency++; + maxConcurrency = Math.max(concurrency, maxConcurrency); + await Promise.resolve(); + concurrency--; + }) + ); + + await Promise.all(promises); + assert.strictEqual(maxConcurrency, 5, 'maxConcurrency is not 5: ' + maxConcurrency); + }); + + it('forwards errors', () => { + const q = new Queue(5); + const promise = q.run(() => Promise.reject(42)); + assert.rejects(promise, 'Should reject'); + }); +}); From 970e762505b4d48f423983508bc65c9b16789539 Mon Sep 17 00:00:00 2001 From: Marco Schumacher Date: Thu, 8 Jul 2021 15:12:50 +0200 Subject: [PATCH 4/6] Updated tests --- package-lock.json | 494 ------------------ package.json | 1 - src/Graph.ts | 2 - src/ModuleLoader.ts | 9 +- src/rollup/rollup.ts | 1 - src/rollup/types.d.ts | 1 - src/utils/fs.ts | 2 +- src/utils/options/normalizeInputOptions.ts | 3 - .../1.js | 0 .../2.js | 0 .../3.js | 0 .../4.js | 0 .../5.js | 0 .../_config.js | 24 + .../main.js | 0 .../max-parallel-file-reads-error/_config.js | 31 ++ .../max-parallel-file-reads-error/dep.js | 0 .../1.js | 0 .../2.js | 0 .../3.js | 0 .../4.js | 0 .../5.js | 0 .../_config.js | 27 + .../main.js | 0 .../1.js | 0 .../2.js | 0 .../3.js | 0 .../4.js | 0 .../5.js | 0 .../max-parallel-file-reads-set/_config.js | 27 + .../main.js | 0 .../_config.js | 16 - .../_config.js | 16 - .../max-parallel-file-reads/_config.js | 16 - test/misc/index.js | 1 - test/misc/queue.js | 33 -- 36 files changed, 111 insertions(+), 593 deletions(-) rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/1.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/2.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/3.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/4.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/5.js (100%) create mode 100644 test/function/samples/max-parallel-file-reads-default/_config.js rename test/function/samples/{max-parallel-file-reads-unlimited-zero => max-parallel-file-reads-default}/main.js (100%) create mode 100644 test/function/samples/max-parallel-file-reads-error/_config.js create mode 100644 test/function/samples/max-parallel-file-reads-error/dep.js rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/1.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/2.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/3.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/4.js (100%) rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/5.js (100%) create mode 100644 test/function/samples/max-parallel-file-reads-infinity/_config.js rename test/function/samples/{max-parallel-file-reads-unlimited => max-parallel-file-reads-infinity}/main.js (100%) rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/1.js (100%) rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/2.js (100%) rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/3.js (100%) rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/4.js (100%) rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/5.js (100%) create mode 100644 test/function/samples/max-parallel-file-reads-set/_config.js rename test/function/samples/{max-parallel-file-reads => max-parallel-file-reads-set}/main.js (100%) delete mode 100644 test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js delete mode 100644 test/function/samples/max-parallel-file-reads-unlimited/_config.js delete mode 100644 test/function/samples/max-parallel-file-reads/_config.js delete mode 100644 test/misc/queue.js diff --git a/package-lock.json b/package-lock.json index c66ea25d4fa..ceff9b941f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1057,12 +1057,6 @@ "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -1141,12 +1135,6 @@ } } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1842,17 +1830,6 @@ "strip-final-newline": "^2.0.0" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1900,15 +1877,6 @@ "reusify": "^1.0.4" } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2299,15 +2267,6 @@ "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -2358,78 +2317,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -3574,12 +3461,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "nanoid": { "version": "3.1.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", @@ -3592,12 +3473,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -3921,12 +3796,6 @@ "word-wrap": "^1.2.3" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4354,328 +4223,6 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rewire": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/rewire/-/rewire-5.0.0.tgz", - "integrity": "sha512-1zfitNyp9RH5UDyGGLe9/1N0bMlPQ0WrX0Tmg11kMHBpqwPJI4gfPpP7YngFyLbFmhXh19SToAG0sKKEFcOIJA==", - "dev": true, - "requires": { - "eslint": "^6.8.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4776,12 +4323,6 @@ } } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4814,12 +4355,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "sander": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/sander/-/sander-0.6.0.tgz", @@ -5267,15 +4802,6 @@ "integrity": "sha512-2cp/YLRm7ly33CzvySyXqo/QEOu4KMn6fCof0gpqosWY3PEJUJJhXP/Cb2wXFUuCzWWJYEmPvdHNzjLlfXC49A==", "dev": true }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -5587,26 +5113,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", diff --git a/package.json b/package.json index 5ca8eddb04b..22b30a8fa05 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,6 @@ "pretty-ms": "^7.0.1", "require-relative": "^0.8.7", "requirejs": "^2.3.6", - "rewire": "^5.0.0", "rollup": "^2.52.0", "rollup-plugin-license": "^2.5.0", "rollup-plugin-string": "^3.0.0", diff --git a/src/Graph.ts b/src/Graph.ts index 6208bc97c7a..67b423bf724 100644 --- a/src/Graph.ts +++ b/src/Graph.ts @@ -51,8 +51,6 @@ export default class Graph { moduleLoader: ModuleLoader; modulesById = new Map(); needsTreeshakingPass = false; - parallelFileReads = 0; - parallelFileReadsMax = 0; phase: BuildPhase = BuildPhase.LOAD_AND_PARSE; pluginDriver: PluginDriver; scope: GlobalScope; diff --git a/src/ModuleLoader.ts b/src/ModuleLoader.ts index 0625d18276a..f7ca8c25194 100644 --- a/src/ModuleLoader.ts +++ b/src/ModuleLoader.ts @@ -222,14 +222,7 @@ export class ModuleLoader { try { source = (await this.pluginDriver.hookFirst('load', [id])) ?? - (await this.readQueue.run(async () => { - this.graph.parallelFileReads++; - this.graph.parallelFileReadsMax = Math.max( - this.graph.parallelFileReadsMax, - this.graph.parallelFileReads - ); - return readFile(id).finally(() => this.graph.parallelFileReads--); - })); + (await this.readQueue.run(async () => readFile(id))); } catch (err) { timeEnd('load modules', 3); let msg = `Could not load ${id}`; diff --git a/src/rollup/rollup.ts b/src/rollup/rollup.ts index dd6a091c3f5..fd8241fb852 100644 --- a/src/rollup/rollup.ts +++ b/src/rollup/rollup.ts @@ -86,7 +86,6 @@ export async function rollupInternal( graph ); }, - maxParallelFileReads: graph.parallelFileReadsMax, watchFiles: Object.keys(graph.watchFiles), async write(rawOutputOptions: OutputOptions) { if (result.closed) return error(errAlreadyClosed()); diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 70f988f6e8e..107d9c75e7a 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -791,7 +791,6 @@ export interface RollupBuild { closed: boolean; generate: (outputOptions: OutputOptions) => Promise; getTimings?: () => SerializedTimings; - maxParallelFileReads: number; watchFiles: string[]; write: (options: OutputOptions) => Promise; } diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 30819b96125..85c867702f9 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -1,4 +1,4 @@ -import * as fs from 'fs'; +import fs from 'fs'; import { dirname } from './path'; export * from 'fs'; diff --git a/src/utils/options/normalizeInputOptions.ts b/src/utils/options/normalizeInputOptions.ts index 8b153b3fca0..267d4eb7cc4 100644 --- a/src/utils/options/normalizeInputOptions.ts +++ b/src/utils/options/normalizeInputOptions.ts @@ -184,9 +184,6 @@ const getMaxParallelFileReads = ( if (maxParallelFileReads <= 0) return Infinity; return maxParallelFileReads; } - if (typeof maxParallelFileReads === 'string' && maxParallelFileReads.match(/^inf(inity)?$/i)) { - return Infinity; - } return 20; }; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/1.js b/test/function/samples/max-parallel-file-reads-default/1.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/1.js rename to test/function/samples/max-parallel-file-reads-default/1.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/2.js b/test/function/samples/max-parallel-file-reads-default/2.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/2.js rename to test/function/samples/max-parallel-file-reads-default/2.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/3.js b/test/function/samples/max-parallel-file-reads-default/3.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/3.js rename to test/function/samples/max-parallel-file-reads-default/3.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/4.js b/test/function/samples/max-parallel-file-reads-default/4.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/4.js rename to test/function/samples/max-parallel-file-reads-default/4.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/5.js b/test/function/samples/max-parallel-file-reads-default/5.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/5.js rename to test/function/samples/max-parallel-file-reads-default/5.js diff --git a/test/function/samples/max-parallel-file-reads-default/_config.js b/test/function/samples/max-parallel-file-reads-default/_config.js new file mode 100644 index 00000000000..306952571a6 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-default/_config.js @@ -0,0 +1,24 @@ +const assert = require('assert'); +const fs = require('fs'); + +const fsReadFile = fs.readFile; +let currentReads = 0; +let maxReads = 0; + +module.exports = { + description: 'maxParallelFileReads not set', + before() { + fs.readFile = (path, options, callback) => { + currentReads++; + maxReads = Math.max(maxReads, currentReads); + fsReadFile(path, options, (err, data) => { + currentReads--; + callback(err, data); + }); + }; + }, + after() { + fs.readFile = fsReadFile; + assert.strictEqual(maxReads, 5, 'Wrong number of parallel file reads: ' + maxReads); + } +}; diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/main.js b/test/function/samples/max-parallel-file-reads-default/main.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited-zero/main.js rename to test/function/samples/max-parallel-file-reads-default/main.js diff --git a/test/function/samples/max-parallel-file-reads-error/_config.js b/test/function/samples/max-parallel-file-reads-error/_config.js new file mode 100644 index 00000000000..86293777a6b --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-error/_config.js @@ -0,0 +1,31 @@ +const assert = require('assert'); +const fs = require('fs'); +const { loader } = require('../../../utils.js'); + +const fsReadFile = fs.readFile; + +module.exports = { + description: 'maxParallelFileReads: fileRead error is forwarded', + options: { + input: 'main', + plugins: loader({ + main: `import {foo} from './dep';` + }) + }, + before() { + fs.readFile = (path, options, callback) => { + if (path.endsWith('test/function/samples/max-parallel-file-reads-error/dep.js')) { + return callback(Error()); + } + + fsReadFile(path, options, callback); + }; + }, + after() { + fs.readFile = fsReadFile; + }, + error: { + message: `Could not load ${__dirname}/dep.js (imported by main): `, + watchFiles: ['main', `${__dirname}/dep.js`] + } +}; diff --git a/test/function/samples/max-parallel-file-reads-error/dep.js b/test/function/samples/max-parallel-file-reads-error/dep.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/function/samples/max-parallel-file-reads-unlimited/1.js b/test/function/samples/max-parallel-file-reads-infinity/1.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/1.js rename to test/function/samples/max-parallel-file-reads-infinity/1.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited/2.js b/test/function/samples/max-parallel-file-reads-infinity/2.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/2.js rename to test/function/samples/max-parallel-file-reads-infinity/2.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited/3.js b/test/function/samples/max-parallel-file-reads-infinity/3.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/3.js rename to test/function/samples/max-parallel-file-reads-infinity/3.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited/4.js b/test/function/samples/max-parallel-file-reads-infinity/4.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/4.js rename to test/function/samples/max-parallel-file-reads-infinity/4.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited/5.js b/test/function/samples/max-parallel-file-reads-infinity/5.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/5.js rename to test/function/samples/max-parallel-file-reads-infinity/5.js diff --git a/test/function/samples/max-parallel-file-reads-infinity/_config.js b/test/function/samples/max-parallel-file-reads-infinity/_config.js new file mode 100644 index 00000000000..486ed945fd9 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-infinity/_config.js @@ -0,0 +1,27 @@ +const assert = require('assert'); +const fs = require('fs'); + +const fsReadFile = fs.readFile; +let currentReads = 0; +let maxReads = 0; + +module.exports = { + description: 'maxParallelFileReads set to infinity', + options: { + maxParallelFileReads: 0 + }, + before() { + fs.readFile = (path, options, callback) => { + currentReads++; + maxReads = Math.max(maxReads, currentReads); + fsReadFile(path, options, (err, data) => { + currentReads--; + callback(err, data); + }); + }; + }, + after() { + fs.readFile = fsReadFile; + assert.strictEqual(maxReads, 5, 'Wrong number of parallel file reads: ' + maxReads); + } +}; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/main.js b/test/function/samples/max-parallel-file-reads-infinity/main.js similarity index 100% rename from test/function/samples/max-parallel-file-reads-unlimited/main.js rename to test/function/samples/max-parallel-file-reads-infinity/main.js diff --git a/test/function/samples/max-parallel-file-reads/1.js b/test/function/samples/max-parallel-file-reads-set/1.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/1.js rename to test/function/samples/max-parallel-file-reads-set/1.js diff --git a/test/function/samples/max-parallel-file-reads/2.js b/test/function/samples/max-parallel-file-reads-set/2.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/2.js rename to test/function/samples/max-parallel-file-reads-set/2.js diff --git a/test/function/samples/max-parallel-file-reads/3.js b/test/function/samples/max-parallel-file-reads-set/3.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/3.js rename to test/function/samples/max-parallel-file-reads-set/3.js diff --git a/test/function/samples/max-parallel-file-reads/4.js b/test/function/samples/max-parallel-file-reads-set/4.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/4.js rename to test/function/samples/max-parallel-file-reads-set/4.js diff --git a/test/function/samples/max-parallel-file-reads/5.js b/test/function/samples/max-parallel-file-reads-set/5.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/5.js rename to test/function/samples/max-parallel-file-reads-set/5.js diff --git a/test/function/samples/max-parallel-file-reads-set/_config.js b/test/function/samples/max-parallel-file-reads-set/_config.js new file mode 100644 index 00000000000..de68cc464a9 --- /dev/null +++ b/test/function/samples/max-parallel-file-reads-set/_config.js @@ -0,0 +1,27 @@ +const assert = require('assert'); +const fs = require('fs'); + +const fsReadFile = fs.readFile; +let currentReads = 0; +let maxReads = 0; + +module.exports = { + description: 'maxParallelFileReads set to 3', + options: { + maxParallelFileReads: 3 + }, + before() { + fs.readFile = (path, options, callback) => { + currentReads++; + maxReads = Math.max(maxReads, currentReads); + fsReadFile(path, options, (err, data) => { + currentReads--; + callback(err, data); + }); + }; + }, + after() { + fs.readFile = fsReadFile; + assert.strictEqual(maxReads, 3, 'Wrong number of parallel file reads: ' + maxReads); + } +}; diff --git a/test/function/samples/max-parallel-file-reads/main.js b/test/function/samples/max-parallel-file-reads-set/main.js similarity index 100% rename from test/function/samples/max-parallel-file-reads/main.js rename to test/function/samples/max-parallel-file-reads-set/main.js diff --git a/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js b/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js deleted file mode 100644 index ba073bba181..00000000000 --- a/test/function/samples/max-parallel-file-reads-unlimited-zero/_config.js +++ /dev/null @@ -1,16 +0,0 @@ -const assert = require('assert'); - -module.exports = { - description: 'limit parallel file reads', - options: { - maxParallelFileReads: 0 - }, - bundle(bundle) { - const maxParallelFileReads = bundle.maxParallelFileReads; - assert.strictEqual( - maxParallelFileReads, - 5, - 'Wrong number of parallel file reads: ' + maxParallelFileReads - ); - } -}; diff --git a/test/function/samples/max-parallel-file-reads-unlimited/_config.js b/test/function/samples/max-parallel-file-reads-unlimited/_config.js deleted file mode 100644 index 68e01596fc8..00000000000 --- a/test/function/samples/max-parallel-file-reads-unlimited/_config.js +++ /dev/null @@ -1,16 +0,0 @@ -const assert = require('assert'); - -module.exports = { - description: 'limit parallel file reads', - options: { - maxParallelFileReads: 'inf' - }, - bundle(bundle) { - const maxParallelFileReads = bundle.maxParallelFileReads; - assert.strictEqual( - maxParallelFileReads, - 5, - 'Wrong number of parallel file reads: ' + maxParallelFileReads - ); - } -}; diff --git a/test/function/samples/max-parallel-file-reads/_config.js b/test/function/samples/max-parallel-file-reads/_config.js deleted file mode 100644 index 6a1edc71d0c..00000000000 --- a/test/function/samples/max-parallel-file-reads/_config.js +++ /dev/null @@ -1,16 +0,0 @@ -const assert = require('assert'); - -module.exports = { - description: 'unlimited parallel file reads', - options: { - maxParallelFileReads: 3 - }, - bundle(bundle) { - const maxParallelFileReads = bundle.maxParallelFileReads; - assert.strictEqual( - maxParallelFileReads, - 3, - 'Wrong number of parallel file reads: ' + maxParallelFileReads - ); - } -}; diff --git a/test/misc/index.js b/test/misc/index.js index 86eeefee0bf..1cdb683e1e2 100644 --- a/test/misc/index.js +++ b/test/misc/index.js @@ -4,6 +4,5 @@ require('./deprecations'); require('./iife'); require('./in-memory-sourcemaps'); require('./misc'); -require('./queue'); require('./sanity-checks'); require('./umd'); diff --git a/test/misc/queue.js b/test/misc/queue.js deleted file mode 100644 index cee6d3dca8b..00000000000 --- a/test/misc/queue.js +++ /dev/null @@ -1,33 +0,0 @@ -const assert = require('assert'); -const rewire = require('rewire'); -const { assertIncludes, loader } = require('../utils.js'); -const rollup = rewire('../../dist/shared/rollup'); - -const Queue = rollup.__get__('Queue'); - -describe('queue', () => { - it('max parallel execution', async () => { - let concurrency = 0, - maxConcurrency = 0; - const q = new Queue(5); - const promises = Array(10) - .fill(0) - .map(() => - q.run(async () => { - concurrency++; - maxConcurrency = Math.max(concurrency, maxConcurrency); - await Promise.resolve(); - concurrency--; - }) - ); - - await Promise.all(promises); - assert.strictEqual(maxConcurrency, 5, 'maxConcurrency is not 5: ' + maxConcurrency); - }); - - it('forwards errors', () => { - const q = new Queue(5); - const promise = q.run(() => Promise.reject(42)); - assert.rejects(promise, 'Should reject'); - }); -}); From 7cdc7b869fde2e44497a4e404938b07f4bfac497 Mon Sep 17 00:00:00 2001 From: Marco Schumacher Date: Thu, 8 Jul 2021 16:16:08 +0200 Subject: [PATCH 5/6] Added docs. --- docs/999-big-list-of-options.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/999-big-list-of-options.md b/docs/999-big-list-of-options.md index 33ce54fa8d4..40d837b86c2 100755 --- a/docs/999-big-list-of-options.md +++ b/docs/999-big-list-of-options.md @@ -336,6 +336,13 @@ For this case, choosing `"ifRelativeSource"` will check if the original import w Note that when a relative path is directly marked as "external" using the [`external`](guide/en/#external) option, then it will be the same relative path in the output. When it is resolved first via a plugin or Rollup core and then marked as external, the above logic will apply. +#### maxParallelFileReads +Type: `number`
+CLI: `--maxParallelFileReads `
+Default: 20 + +Limits the number of files rollup will open in parallel when reading modules. Without a limit or with a high enough value, builds can fail with an "EMFILE: too many open files". This dependes on how many open file handles the os allows. + #### onwarn Type: `(warning: RollupWarning, defaultHandler: (warning: string | RollupWarning) => void) => void;` From 4891c107945143e8edc91fd5e6c7f030411f39a6 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 9 Jul 2021 06:16:56 +0200 Subject: [PATCH 6/6] Fix test on Windows --- .../samples/max-parallel-file-reads-error/_config.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/function/samples/max-parallel-file-reads-error/_config.js b/test/function/samples/max-parallel-file-reads-error/_config.js index 86293777a6b..c535cfaa10c 100644 --- a/test/function/samples/max-parallel-file-reads-error/_config.js +++ b/test/function/samples/max-parallel-file-reads-error/_config.js @@ -1,5 +1,5 @@ -const assert = require('assert'); const fs = require('fs'); +const path = require('path'); const { loader } = require('../../../utils.js'); const fsReadFile = fs.readFile; @@ -14,8 +14,8 @@ module.exports = { }, before() { fs.readFile = (path, options, callback) => { - if (path.endsWith('test/function/samples/max-parallel-file-reads-error/dep.js')) { - return callback(Error()); + if (path.endsWith('dep.js')) { + return callback(new Error('broken')); } fsReadFile(path, options, callback); @@ -25,7 +25,7 @@ module.exports = { fs.readFile = fsReadFile; }, error: { - message: `Could not load ${__dirname}/dep.js (imported by main): `, - watchFiles: ['main', `${__dirname}/dep.js`] + message: `Could not load ${path.join(__dirname, 'dep.js')} (imported by main): broken`, + watchFiles: ['main', path.join(__dirname, 'dep.js')] } };