UNPKG

2.11 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5const fs = require('fs');
6const path = require('path');
7
8/**
9 * Derived significantly from package find-up@2.0.0. See license below.
10 *
11 * @copyright Sindre Sorhus
12 * MIT License
13 *
14 * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
15 *
16 * Permission is hereby granted, free of charge, to any person obtaining a copy
17 * of this software and associated documentation files (the "Software"), to deal
18 * in the Software without restriction, including without limitation the rights
19 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20 * copies of the Software, and to permit persons to whom the Software is
21 * furnished to do so, subject to the following conditions:
22 *
23 * The above copyright notice and this permission notice shall be included in
24 * all copies or substantial portions of the Software.
25 *
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32 * THE SOFTWARE.
33 */
34
35/** @type {(filename: string | string[], cwd?: string) => string | null} */
36function findUp(filename, cwd) {
37 let dir = path.resolve(cwd || '');
38 const root = path.parse(dir).root;
39
40 /** @type {string[]} */ // @ts-expect-error TS sucks with concat
41 const filenames = [].concat(filename);
42
43 // eslint-disable-next-line no-constant-condition
44 while (true) {
45 const file = filenames.find((el) => fs.existsSync(path.resolve(dir, el)));
46
47 if (file) {
48 return path.join(dir, file);
49 }
50 if (dir === root) {
51 return null;
52 }
53
54 dir = path.dirname(dir);
55 }
56}
57
58/** @type {import('./pkgUp').default} */
59exports.default = function pkgUp(opts) {
60 return findUp('package.json', opts && opts.cwd);
61};