gitea push
This commit is contained in:
+112
-102
@@ -83,112 +83,122 @@ function loadDescriptionFile(
|
||||
resolveContext,
|
||||
callback,
|
||||
) {
|
||||
(function findDescriptionFile() {
|
||||
// Hoist the per-filename iterator and the per-level done callback out
|
||||
// of `findDescriptionFile`. They both close over `directory`, which we
|
||||
// reassign as we walk up the tree, so the same closures keep working
|
||||
// across every level — the previous implementation re-allocated both
|
||||
// arrows on every recursion step, which adds up on deep walks (multiple
|
||||
// `DescriptionFilePlugin` taps per resolve, each climbing several
|
||||
// directories looking for `package.json`).
|
||||
/**
|
||||
* @param {string} filename filename
|
||||
* @param {(err?: null | Error, result?: null | Result) => void} iterCallback callback
|
||||
* @returns {void}
|
||||
*/
|
||||
const iterFilename = (filename, iterCallback) => {
|
||||
const descriptionFilePath = resolver.join(directory, filename);
|
||||
|
||||
/**
|
||||
* @param {(null | Error)=} err error
|
||||
* @param {JsonObject=} resolvedContent content
|
||||
* @returns {void}
|
||||
*/
|
||||
function onJson(err, resolvedContent) {
|
||||
if (err) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`${descriptionFilePath} (directory description file): ${err}`,
|
||||
);
|
||||
} else {
|
||||
err.message = `${descriptionFilePath} (directory description file): ${err}`;
|
||||
}
|
||||
return iterCallback(err);
|
||||
}
|
||||
iterCallback(null, {
|
||||
content: /** @type {JsonObject} */ (resolvedContent),
|
||||
directory,
|
||||
path: descriptionFilePath,
|
||||
});
|
||||
}
|
||||
|
||||
if (resolver.fileSystem.readJson) {
|
||||
resolver.fileSystem.readJson(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (
|
||||
typeof (/** @type {NodeJS.ErrnoException} */ (err).code) !==
|
||||
"undefined"
|
||||
) {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return iterCallback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return onJson(err);
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
onJson(null, content);
|
||||
});
|
||||
} else {
|
||||
resolver.fileSystem.readFile(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return iterCallback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
|
||||
/** @type {JsonObject | undefined} */
|
||||
let json;
|
||||
|
||||
if (content) {
|
||||
try {
|
||||
json = JSON.parse(content.toString());
|
||||
} catch (/** @type {unknown} */ err_) {
|
||||
return onJson(/** @type {Error} */ (err_));
|
||||
}
|
||||
} else {
|
||||
return onJson(new Error("No content in file"));
|
||||
}
|
||||
|
||||
onJson(null, json);
|
||||
});
|
||||
}
|
||||
};
|
||||
// Forward-declared so the helpers below can reference each other
|
||||
// without falling foul of `no-use-before-define`.
|
||||
/** @type {() => void} */
|
||||
let findDescriptionFile;
|
||||
/**
|
||||
* @param {(null | Error)=} err error
|
||||
* @param {(null | Result)=} result result
|
||||
* @returns {void}
|
||||
*/
|
||||
const onLevelDone = (err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
const dir = cdUp(directory);
|
||||
if (!dir) {
|
||||
return callback();
|
||||
}
|
||||
directory = dir;
|
||||
return findDescriptionFile();
|
||||
};
|
||||
findDescriptionFile = () => {
|
||||
if (oldInfo && oldInfo.directory === directory) {
|
||||
// We already have info for this directory and can reuse it
|
||||
return callback(null, oldInfo);
|
||||
}
|
||||
forEachBail(
|
||||
filenames,
|
||||
/**
|
||||
* @param {string} filename filename
|
||||
* @param {(err?: null | Error, result?: null | Result) => void} callback callback
|
||||
* @returns {void}
|
||||
*/
|
||||
(filename, callback) => {
|
||||
const descriptionFilePath = resolver.join(directory, filename);
|
||||
|
||||
/**
|
||||
* @param {(null | Error)=} err error
|
||||
* @param {JsonObject=} resolvedContent content
|
||||
* @returns {void}
|
||||
*/
|
||||
function onJson(err, resolvedContent) {
|
||||
if (err) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`${descriptionFilePath} (directory description file): ${err}`,
|
||||
);
|
||||
} else {
|
||||
err.message = `${descriptionFilePath} (directory description file): ${err}`;
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
callback(null, {
|
||||
content: /** @type {JsonObject} */ (resolvedContent),
|
||||
directory,
|
||||
path: descriptionFilePath,
|
||||
});
|
||||
}
|
||||
|
||||
if (resolver.fileSystem.readJson) {
|
||||
resolver.fileSystem.readJson(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (
|
||||
typeof (/** @type {NodeJS.ErrnoException} */ (err).code) !==
|
||||
"undefined"
|
||||
) {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return onJson(err);
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
onJson(null, content);
|
||||
});
|
||||
} else {
|
||||
resolver.fileSystem.readFile(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
|
||||
/** @type {JsonObject | undefined} */
|
||||
let json;
|
||||
|
||||
if (content) {
|
||||
try {
|
||||
json = JSON.parse(content.toString());
|
||||
} catch (/** @type {unknown} */ err_) {
|
||||
return onJson(/** @type {Error} */ (err_));
|
||||
}
|
||||
} else {
|
||||
return onJson(new Error("No content in file"));
|
||||
}
|
||||
|
||||
onJson(null, json);
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @param {(null | Error)=} err error
|
||||
* @param {(null | Result)=} result result
|
||||
* @returns {void}
|
||||
*/
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
const dir = cdUp(directory);
|
||||
if (!dir) {
|
||||
return callback();
|
||||
}
|
||||
directory = dir;
|
||||
return findDescriptionFile();
|
||||
},
|
||||
);
|
||||
})();
|
||||
forEachBail(filenames, iterFilename, onLevelDone);
|
||||
};
|
||||
findDescriptionFile();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user