You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					47 lines
				
				968 B
			
		
		
			
		
	
	
					47 lines
				
				968 B
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								const locatePath = require('locate-path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = (filename, opts = {}) => {
							 | 
						||
| 
								 | 
							
									const startDir = path.resolve(opts.cwd || '');
							 | 
						||
| 
								 | 
							
									const {root} = path.parse(startDir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const filenames = [].concat(filename);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return new Promise(resolve => {
							 | 
						||
| 
								 | 
							
										(function find(dir) {
							 | 
						||
| 
								 | 
							
											locatePath(filenames, {cwd: dir}).then(file => {
							 | 
						||
| 
								 | 
							
												if (file) {
							 | 
						||
| 
								 | 
							
													resolve(path.join(dir, file));
							 | 
						||
| 
								 | 
							
												} else if (dir === root) {
							 | 
						||
| 
								 | 
							
													resolve(null);
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
													find(path.dirname(dir));
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											});
							 | 
						||
| 
								 | 
							
										})(startDir);
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.sync = (filename, opts = {}) => {
							 | 
						||
| 
								 | 
							
									let dir = path.resolve(opts.cwd || '');
							 | 
						||
| 
								 | 
							
									const {root} = path.parse(dir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const filenames = [].concat(filename);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// eslint-disable-next-line no-constant-condition
							 | 
						||
| 
								 | 
							
									while (true) {
							 | 
						||
| 
								 | 
							
										const file = locatePath.sync(filenames, {cwd: dir});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (file) {
							 | 
						||
| 
								 | 
							
											return path.join(dir, file);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (dir === root) {
							 | 
						||
| 
								 | 
							
											return null;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										dir = path.dirname(dir);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								};
							 |