aboutsummaryrefslogtreecommitdiff
path: root/node_modules/find-up/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/find-up/index.js')
-rw-r--r--node_modules/find-up/index.js89
1 files changed, 89 insertions, 0 deletions
diff --git a/node_modules/find-up/index.js b/node_modules/find-up/index.js
new file mode 100644
index 0000000..ce564e5
--- /dev/null
+++ b/node_modules/find-up/index.js
@@ -0,0 +1,89 @@
+'use strict';
+const path = require('path');
+const locatePath = require('locate-path');
+const pathExists = require('path-exists');
+
+const stop = Symbol('findUp.stop');
+
+module.exports = async (name, options = {}) => {
+ let directory = path.resolve(options.cwd || '');
+ const {root} = path.parse(directory);
+ const paths = [].concat(name);
+
+ const runMatcher = async locateOptions => {
+ if (typeof name !== 'function') {
+ return locatePath(paths, locateOptions);
+ }
+
+ const foundPath = await name(locateOptions.cwd);
+ if (typeof foundPath === 'string') {
+ return locatePath([foundPath], locateOptions);
+ }
+
+ return foundPath;
+ };
+
+ // eslint-disable-next-line no-constant-condition
+ while (true) {
+ // eslint-disable-next-line no-await-in-loop
+ const foundPath = await runMatcher({...options, cwd: directory});
+
+ if (foundPath === stop) {
+ return;
+ }
+
+ if (foundPath) {
+ return path.resolve(directory, foundPath);
+ }
+
+ if (directory === root) {
+ return;
+ }
+
+ directory = path.dirname(directory);
+ }
+};
+
+module.exports.sync = (name, options = {}) => {
+ let directory = path.resolve(options.cwd || '');
+ const {root} = path.parse(directory);
+ const paths = [].concat(name);
+
+ const runMatcher = locateOptions => {
+ if (typeof name !== 'function') {
+ return locatePath.sync(paths, locateOptions);
+ }
+
+ const foundPath = name(locateOptions.cwd);
+ if (typeof foundPath === 'string') {
+ return locatePath.sync([foundPath], locateOptions);
+ }
+
+ return foundPath;
+ };
+
+ // eslint-disable-next-line no-constant-condition
+ while (true) {
+ const foundPath = runMatcher({...options, cwd: directory});
+
+ if (foundPath === stop) {
+ return;
+ }
+
+ if (foundPath) {
+ return path.resolve(directory, foundPath);
+ }
+
+ if (directory === root) {
+ return;
+ }
+
+ directory = path.dirname(directory);
+ }
+};
+
+module.exports.exists = pathExists;
+
+module.exports.sync.exists = pathExists.sync;
+
+module.exports.stop = stop;