| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- /** @typedef {import("./Resolver").ResolveContext} ResolveContext */
- /**
- * Build the `ResolveContext` passed into the next hook in the chain.
- *
- * The caller — `Resolver.doResolve` — runs on every resolve step, so we
- * want to allocate as little as possible here. Previously the caller
- * constructed a temporary `{ log, yield, fileDependencies, ... }` literal
- * and handed it to this helper, which then copied those same fields into
- * a second fresh object. That's two allocations per step for what is
- * effectively a struct copy with one mutated field (`stack`) and one
- * optionally-wrapped field (`log`). Taking the parent context and the
- * two things we actually want to change (stack, message) as separate
- * arguments lets us allocate exactly one inner context.
- * @param {ResolveContext} parent parent resolve context to inherit dependency sets / yield from
- * @param {ResolveContext["stack"]} stack new stack tip for the nested call
- * @param {null | string} message log message prefix for this step
- * @returns {ResolveContext} inner context
- */
- module.exports = function createInnerContext(parent, stack, message) {
- const parentLog = parent.log;
- let innerLog;
- if (parentLog) {
- if (message) {
- let messageReported = false;
- /**
- * @param {string} msg message
- */
- innerLog = (msg) => {
- if (!messageReported) {
- parentLog(message);
- messageReported = true;
- }
- parentLog(` ${msg}`);
- };
- } else {
- innerLog = parentLog;
- }
- }
- return {
- log: innerLog,
- yield: parent.yield,
- fileDependencies: parent.fileDependencies,
- contextDependencies: parent.contextDependencies,
- missingDependencies: parent.missingDependencies,
- stack,
- };
- };
|