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