1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3    return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.createForProject = exports.resolvePackageManager = exports.findWorkspaceRoot = exports.RESOLUTION_ORDER = void 0;
7const fs_1 = __importDefault(require("fs"));
8const path_1 = __importDefault(require("path"));
9const NpmPackageManager_1 = require("../node/NpmPackageManager");
10const PnpmPackageManager_1 = require("../node/PnpmPackageManager");
11const YarnPackageManager_1 = require("../node/YarnPackageManager");
12const nodeWorkspaces_1 = require("./nodeWorkspaces");
13/** The order of the package managers to use when resolving automatically */
14exports.RESOLUTION_ORDER = ['yarn', 'npm', 'pnpm'];
15/**
16 * Resolve the workspace root for a project, if its part of a monorepo.
17 * Optionally, provide a specific packager to only resolve that one specifically.
18 */
19function findWorkspaceRoot(projectRoot, preferredManager) {
20    const strategies = {
21        npm: nodeWorkspaces_1.findYarnOrNpmWorkspaceRoot,
22        yarn: nodeWorkspaces_1.findYarnOrNpmWorkspaceRoot,
23        pnpm: nodeWorkspaces_1.findPnpmWorkspaceRoot,
24    };
25    if (preferredManager) {
26        return strategies[preferredManager](projectRoot);
27    }
28    for (const strategy of exports.RESOLUTION_ORDER) {
29        const root = strategies[strategy](projectRoot);
30        if (root) {
31            return root;
32        }
33    }
34    return null;
35}
36exports.findWorkspaceRoot = findWorkspaceRoot;
37/**
38 * Resolve the used node package manager for a project by checking the lockfile.
39 * This also tries to resolve the workspace root, if its part of a monorepo.
40 * Optionally, provide a preferred packager to only resolve that one specifically.
41 */
42function resolvePackageManager(projectRoot, preferredManager) {
43    const root = findWorkspaceRoot(projectRoot, preferredManager) ?? projectRoot;
44    const lockFiles = {
45        npm: nodeWorkspaces_1.NPM_LOCK_FILE,
46        pnpm: nodeWorkspaces_1.PNPM_LOCK_FILE,
47        yarn: nodeWorkspaces_1.YARN_LOCK_FILE,
48    };
49    if (preferredManager) {
50        if (fs_1.default.existsSync(path_1.default.join(root, lockFiles[preferredManager]))) {
51            return preferredManager;
52        }
53        return null;
54    }
55    for (const managerName of exports.RESOLUTION_ORDER) {
56        if (fs_1.default.existsSync(path_1.default.join(root, lockFiles[managerName]))) {
57            return managerName;
58        }
59    }
60    return null;
61}
62exports.resolvePackageManager = resolvePackageManager;
63/**
64 * This creates a Node package manager from the provided options.
65 * If these options are not provided, it will infer the package manager from lockfiles.
66 * When no package manager is found, it falls back to npm.
67 */
68function createForProject(projectRoot, options = {}) {
69    if (options.npm) {
70        return new NpmPackageManager_1.NpmPackageManager({ cwd: projectRoot, ...options });
71    }
72    else if (options.yarn) {
73        return new YarnPackageManager_1.YarnPackageManager({ cwd: projectRoot, ...options });
74    }
75    else if (options.pnpm) {
76        return new PnpmPackageManager_1.PnpmPackageManager({ cwd: projectRoot, ...options });
77    }
78    switch (resolvePackageManager(projectRoot)) {
79        case 'npm':
80            return new NpmPackageManager_1.NpmPackageManager({ cwd: projectRoot, ...options });
81        case 'pnpm':
82            return new PnpmPackageManager_1.PnpmPackageManager({ cwd: projectRoot, ...options });
83        case 'yarn':
84            return new YarnPackageManager_1.YarnPackageManager({ cwd: projectRoot, ...options });
85        default:
86            return new NpmPackageManager_1.NpmPackageManager({ cwd: projectRoot, ...options });
87    }
88}
89exports.createForProject = createForProject;
90//# sourceMappingURL=nodeManagers.js.map