identify-monorepo-root
Version:
Find the root directory of any given monorepo (works with npm, yarn, pnpm, turbo, etc.)
98 lines (97 loc) • 3.35 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.identifyMonorepoRoot = void 0;
var path = __importStar(require("path"));
var who_am_i_now_1 = require("who-am-i-now");
var identifyMonorepoRoot = function () {
var who = (0, who_am_i_now_1.whoAmINow)();
if (!who.isServerApp) {
throw new Error("Library 'identify-monorepo-root' can only be used server side.");
}
var fs;
try {
fs = require("fs");
}
catch (e) {
// do nothing
}
var isDirRoot = function (currentDir) {
var files = fs.readdirSync(currentDir);
// check for package manager lock files:
var lockFile = files.find(function (f) {
return f === "pnpm-lock.yaml" || f === "yarn.lock" || f === "package-lock.json";
});
if (lockFile) {
return "true";
}
// check for a package.json file with certain properties:
var packageJson = files.find(function (f) { return f === "package.json"; });
if (packageJson) {
var packageJsonFile = fs.readFileSync(path.resolve(currentDir, "package.json"), "utf-8");
if (packageJsonFile.packageManager) {
return "true";
}
return "maybe";
}
return "false";
};
var isRoot = "false";
var lastPossibleRootDir;
var currentDir = process.cwd() || __dirname;
while (true) {
isRoot = isDirRoot(currentDir);
if (isRoot === "maybe") {
lastPossibleRootDir = currentDir;
}
else if (isRoot === "true") {
break;
}
if (currentDir === "/") {
break;
}
currentDir = path.resolve(currentDir, "..");
}
if (isRoot === "true") {
return currentDir;
}
else if (lastPossibleRootDir) {
return lastPossibleRootDir;
}
else {
return null;
}
};
exports.identifyMonorepoRoot = identifyMonorepoRoot;